我可以在 R 的某些列条件下仅在某些列中聚合行而不更改其他列吗?
Can I aggregate rows by under certain columns condition on R just in certain columns without changing the others?
假设您有一个大的 df,并且您想要一种简单快速的方法从 df(一个大的 R 数据帧)获取 df1:
df:
index var1 var2 var3 var4
0 2 4 8 7
1 2 3 9 6
2 1 5 10 8
2 1 5 7 8
2 2 9 33 10
2 2 9 17 10
3 3 6 6 9
3 4 7 11 10
想法是聚合(按总和)具有相同索引和相同 var1 的行,而不更改其他行。请注意,每个索引 var2 组合的 var4 相同。
df1:
index var1 var2 var3 var4
0 2 4 8 7
1 2 3 9 6
2 1 5 17 8
2 2 9 50 10
3 3 6 6 9
3 4 7 11 10
您可以使用 rowsum
来 按总和 聚合。
rowsum(x[4], interaction(x[-4]))
#1.2.3.6 9
#0.2.4.7 8
#2.1.5.8 17
#3.3.6.9 6
#3.4.7.10 11
#2.2.9.10 50
或使用aggregate
:
aggregate(var3 ~ ., x, sum)
# index var1 var2 var4 var3
#1 1 2 3 6 9
#2 0 2 4 7 8
#3 2 1 5 8 17
#4 3 3 6 9 6
#5 3 4 7 10 11
#6 2 2 9 10 50
数据:
x <- structure(list(index = c(0L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), var1 = c(2L,
2L, 1L, 1L, 2L, 2L, 3L, 4L), var2 = c(4L, 3L, 5L, 5L, 9L, 9L,
6L, 7L), var3 = c(8L, 9L, 10L, 7L, 33L, 17L, 6L, 11L), var4 = c(7L,
6L, 8L, 8L, 10L, 10L, 9L, 10L)), class = "data.frame", row.names = c(NA,
-8L))
也许你可以使用 aggregate()
如下
v <- aggregate(df[-(1:2)], df[1:2], function(x) sum(unique(x)))
res <- v[order(v$index),]
因此
> res
index var1 var2 var3 var4
2 0 2 4 8 7
3 1 2 3 9 6
1 2 1 5 17 8
4 2 2 9 50 10
5 3 3 6 6 9
6 3 4 7 11 10
假设您有一个大的 df,并且您想要一种简单快速的方法从 df(一个大的 R 数据帧)获取 df1:
df:
index var1 var2 var3 var4
0 2 4 8 7
1 2 3 9 6
2 1 5 10 8
2 1 5 7 8
2 2 9 33 10
2 2 9 17 10
3 3 6 6 9
3 4 7 11 10
想法是聚合(按总和)具有相同索引和相同 var1 的行,而不更改其他行。请注意,每个索引 var2 组合的 var4 相同。
df1:
index var1 var2 var3 var4
0 2 4 8 7
1 2 3 9 6
2 1 5 17 8
2 2 9 50 10
3 3 6 6 9
3 4 7 11 10
您可以使用 rowsum
来 按总和 聚合。
rowsum(x[4], interaction(x[-4]))
#1.2.3.6 9
#0.2.4.7 8
#2.1.5.8 17
#3.3.6.9 6
#3.4.7.10 11
#2.2.9.10 50
或使用aggregate
:
aggregate(var3 ~ ., x, sum)
# index var1 var2 var4 var3
#1 1 2 3 6 9
#2 0 2 4 7 8
#3 2 1 5 8 17
#4 3 3 6 9 6
#5 3 4 7 10 11
#6 2 2 9 10 50
数据:
x <- structure(list(index = c(0L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), var1 = c(2L,
2L, 1L, 1L, 2L, 2L, 3L, 4L), var2 = c(4L, 3L, 5L, 5L, 9L, 9L,
6L, 7L), var3 = c(8L, 9L, 10L, 7L, 33L, 17L, 6L, 11L), var4 = c(7L,
6L, 8L, 8L, 10L, 10L, 9L, 10L)), class = "data.frame", row.names = c(NA,
-8L))
也许你可以使用 aggregate()
如下
v <- aggregate(df[-(1:2)], df[1:2], function(x) sum(unique(x)))
res <- v[order(v$index),]
因此
> res
index var1 var2 var3 var4
2 0 2 4 8 7
3 1 2 3 9 6
1 2 1 5 17 8
4 2 2 9 50 10
5 3 3 6 6 9
6 3 4 7 11 10