我创建了以下最小的例子。
我想要转换这个数据框(这是一个融合,因此有三列:时间,房间和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 :(得分: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
可能有一种更简单的方法,但它起作用,至少。对于NA
和ID
的相同组合,它确实假设Time
不具有不同的非Room
值,因此请了解您的数据。