【发布时间】:2021-11-08 21:21:09
【问题描述】:
我想折叠 data.frame 的某些特定行(最好使用 dplyr in )。折叠应该通过函数 sum() 聚合一些列,而另一些则通过 mean() 聚合。
例如,让我们将一个基于字符的唯一 ID 添加到 iris 数据集。
iris_df <- iris[1:5,]
iris_df$ID <- paste("ID_",1:nrow(iris_df),sep="")
这就是我们开始的地方:
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5),
Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6),
Petal.Length = c(1.4, 1.4, 1.3, 1.5, 1.4),
Petal.Width = c(0.2, 0.2, 0.2, 0.2, 0.2),
Species = structure(c(1L, 1L, 1L, 1L, 1L),
.Label = c("setosa", "versicolor", "virginica"), class = "factor"),
ID = c("ID_1", "ID_2", "ID_3", "ID_4","ID_5")),
row.names = c(NA, 5L), class = "data.frame")
现在,我想折叠 ID==ID_1 + ID==ID_2 的情况。为此,Sepal 值应聚合为均值,Petal 值应聚合为总和。 ID应该变成“ID_1+ID_2”(所以通过paste()聚合?)
这是最终结果的样子:
structure(list(Sepal.Length = c(5.0, 4.7, 4.6, 5),
Sepal.Width = c(3.25, 3.2, 3.1, 3.6),
Petal.Length = c(2.8, 1.3, 1.5, 1.4),
Petal.Width = c(0.4, 0.2, 0.2, 0.2),
Species = structure(c(1L, 1L, 1L, 1L),
.Label = c("setosa", "versicolor", "virginica"), class = "factor"),
ID = c("ID_1+ID_2", "ID_3", "ID_4","ID_5")),
row.names = c(NA, 4L), class = "data.frame")
这可以使用dplyr(使用group_by() 和summarize())包来完成吗?
更新:作为一些附加说明,所需的过程应该承认行索引是先验未知的,例如只是 ID_x 和 ID_y 需要折叠(并且 ID_x 可能是第 i 行和第 j 行的 ID_y)。
【问题讨论】: