【问题标题】:Can I aggregate rows by under certain columns condition on R just in certain columns without changing the others?我可以在 R 的某些列条件下仅在某些列中聚合行而不更改其他列吗?
【发布时间】:2019-12-02 14:49:22
【问题描述】:

假设您有一个很大的 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

【问题讨论】:

  • 你只想总结列var3?如果其他列在聚合中不是唯一的或者每个组是唯一的,那么它们应该如何处理?
  • this question 是关于如何对 1 列求和,按另外 1 列分组。您的问题是关于如何对 m 列求和,按其他 n 列(m 和 n > 1)分组,但是那里的大多数答案也可以用于您的情况(m 和 n > 1)。
  • 是 @GKi ,其他列是唯一的。每个 var1 组。另外,这就是 IceCreamToucan 所说的,按其他 n 列分组(m 和 n>1)
  • 好的。然后您也可以使用它们进行分组以将它们保留在输出中。

标签: r dataframe group-by aggregate tidy


【解决方案1】:

也许你可以使用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

【讨论】:

  • 如果var3 在一个组内多次持有相同的值,它可能会出现意想不到的sum
  • @GKi 好吧.....我猜 OP 只是想保留重复项而不是将它们相加,所以我使用了sum(unique(x)),但不确定输出规则
  • 再次感谢@ThomasIsCoding,我在获取其余列时遇到了麻烦。
【解决方案2】:

您可以使用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))

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2013-05-07
    相关资源
    最近更新 更多