gpt4 book ai didi

使用总和和计数将数据从长数据 reshape 为宽数据

转载 作者:行者123 更新时间:2023-12-03 00:11:29 26 4
gpt4 key购买 nike

我正在尝试在 R 中将数据从长格式 reshape 为宽格式。我想通过 ID 获取类型变量的出现次数以及第二个变量的值的总和 (val )按 ID 并键入,如下例所示。

我能够找到使用计数或总和进行 reshape 的答案,但不能同时找到两者。

这是原始示例数据:

> 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 列显示按类型划分的值的总和。

为了达到我能做到的计数,如 this answer 中建议的那样,将 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

类似地,如 this answer 中所建议的那样,我还可以使用总和作为输出来执行 reshape ,这次使用 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

但是有没有一种方法可以一次性完成这一切(不一定使用 dcastreshape2)?

最佳答案

从 data.table v1.9.6 开始,可以转换多个 value.var 列,也可以通过提供多个 fun.aggregate 函数进行转换。见下文:

library(data.table)

df <- data.table(df)
dcast(df, id ~ type, fun = list(length, sum), value.var = c("val"))
id val_length_A val_length_B val_length_C val_sum_A val_sum_B val_sum_C
1: 1 2 1 0 1 2 0
2: 2 1 1 1 0 0 4

关于使用总和和计数将数据从长数据 reshape 为宽数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51456294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com