我正在尝试在R中将数据从长格式重塑为宽格式。我想通过ID获取类型变量的出现次数和第二个变量(
我能够找到关于计数或求和重塑的答案,但没有同时满足两者的解决方法。
以下是原始数据示例:
我想要得到的输出如下所示:
val
)的值的总和,如下例所示。我能够找到关于计数或求和重塑的答案,但没有同时满足两者的解决方法。
以下是原始数据示例:
> df <- data.frame(id = c(1, 1, 1, 2, 2, 2),
+ type = c("A", "A", "B", "A", "B", "C"),
+ val = c(0, 1, 2, 0, 0, 4))
> df
id type val
1 1 A 0
2 1 A 1
3 1 B 2
4 2 A 0
5 2 B 0
6 2 C 4
我想要得到的输出如下所示:
id A.count B.count C.count A.sum B.sum C.sum
1 1 2 1 0 1 2 0
2 2 1 1 1 0 0 4
在这里,count
列显示类型A、B和C的出现次数,而sum
列则显示按类型累加后的值。
为了实现计数,我可以像这个答案中建议的那样,使用reshape2::dcast
函数,默认聚合函数为length
:
> require(reshape2)
> df.c <- dcast(df, id ~ type, value.var = "type", fun.aggregate = length)
> df.c
id A B C
1 1 2 1 0
2 2 1 1 1
同样地,正如这个答案中建议的那样,我也可以使用dcast
函数中的sum
聚合函数作为输出来执行重塑操作:
> df.s <- dcast(df, id ~ type, value.var = "val", fun.aggregate = sum)
> df.s
id A B C
1 1 1 2 0
2 2 0 0 4
我可以合并这两个:
> merge(x = df.c, y = df.s, by = "id", all = TRUE)
id A.x B.x C.x A.y B.y C.y
1 1 2 1 0 1 2 0
2 2 1 1 1 0 0 4
但是否有一种方法可以一次性完成所有操作(不一定使用dcast
或reshape2
)?