2016-03-03 30 views
0

我已經創建了下面的最小示例聚集數據幀。如何在r中

我想打開該數據幀(它是一種熔化,從而有三列:時間,房間ID)

structure(list(
    Time = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 
      3, 3, 3, 3, 3, 3, 3), 
    Room = c("a", "a", "b", "b", "c", "c", "d", "d", "e", "e", "a", "a", "b", "b", 
      "c", "c", "d", "d", "e", "e", "a", "a", "b","b", "c", "c", "d", "d", 
      "e", "e"), 
    ID = c("A", NA, NA, NA, NA, NA, NA, "B", NA, NA, NA, NA, NA, "C", NA, "D", 
      NA, "E", NA, "F", NA, NA, NA, "G", NA, NA, NA, "H", NA, "I")), 
    class  = c("tbl_df", "tbl", "data.frame"), 
    row.names = c(NA, 30L), 
    .Names = c("Time", "Room", "ID")) 

到該數據幀

structure(
    list(
    Time = c(1, 2, 3), 
    a = c("A", NA, NA), 
    b = c(NA, "C", "G"), 
    c = c(NA, "D", NA), 
    d = c("B", "E", "H"), 
    e = c(NA, "F", "I") 
), 
    class = c("tbl_df", "tbl", "data.frame"), 
    row.names = c(NA, -3L), 
    .Names = c("Time", "a", "b", "c", "d", "e") 
) 

其具有作爲列的房間,作爲行的時間和作爲條目的ID。

我試過如下:

dcast(df, Time~Room, fun.aggregate=NULL, value.var='ID') 

但這說:Aggregation function missing: defaulting to length雖然結構看起來不錯不返回ID值。我也試過aggregate,但似乎不知道該怎麼做。

+0

從您的來電dcast刪除fun.aggregate。 – Heroka

回答

2

您可以編寫自己的聚合函數中拉出第一個值不是NA

dcast(df, Time ~ Room, fun.aggregate = function(x){x[!is.na(x)][1]}, value.var = 'ID') 

返回

Time a b c d e 
1 1 A <NA> <NA> B <NA> 
2 2 <NA> C D E F 
3 3 <NA> G <NA> H I 

有可能是一個更簡單的方法,但它的作品,至少。它確實假設您對於TimeRoom的相同組合ID的值不會有不同的非NA值,所以知道您的數據。

+0

Thx。你的解決方案適用於我最小的例子,但是當我將它應用到我更大的數據框時,我似乎每次只能得到第一個非空房間。 – Geoff

+0

@Geoff - 是不是這只是一個長到寬重塑 - '重塑(DF [complete.cases(DF),],idvar = 「時間」,timevar = 「房間」,方向= 「寬」)' ?也許在這個'dcast'回答 – thelatemail

+0

@thelatemail試試用'df [complete.cases(df),]'代替'df'也許你是對的。當我在完整的數據框上嘗試它時,我得到了與上述註釋完全相同的問題(除了您的版本還重命名添加ID前綴的列)。 – Geoff