如何在r中聚合数据帧

时间:2016-03-03 21:57:59

标签: r data-manipulation

我创建了以下最小的例子。

我想要转换这个数据框(这是一个融合,因此有三列:时间,房间和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,但似乎不知道该怎么做。

1 个答案:

答案 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

可能有一种更简单的方法,但它起作用,至少。对于NAID的相同组合,它确实假设Time不具有不同的非Room值,因此请了解您的数据。