如何在 r 中聚合数据框
How to aggregate data frame in r
我创建了以下最小示例。
我要转这个dataframe(就是熔化所以有三列:Time,Room和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
而不是 return ID 值,尽管结构看起来不错。
我也试过aggregate
但似乎不知道该怎么做。
您可以编写自己的聚合函数来提取第一个不是 NA
:
的值
dcast(df, Time ~ Room, fun.aggregate = function(x){x[!is.na(x)][1]}, value.var = 'ID')
哪个returns
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
可能有更简单的方法,但至少有效。它假设对于 Time
和 Room
的相同组合,ID
不会有不同的非 NA
值,所以请了解您的数据。
我创建了以下最小示例。
我要转这个dataframe(就是熔化所以有三列:Time,Room和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
而不是 return ID 值,尽管结构看起来不错。
我也试过aggregate
但似乎不知道该怎么做。
您可以编写自己的聚合函数来提取第一个不是 NA
:
dcast(df, Time ~ Room, fun.aggregate = function(x){x[!is.na(x)][1]}, value.var = 'ID')
哪个returns
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
可能有更简单的方法,但至少有效。它假设对于 Time
和 Room
的相同组合,ID
不会有不同的非 NA
值,所以请了解您的数据。