在基于行值执行数学运算之前运行子集数据

时间:2017-09-17 02:37:01

标签: r dataframe subset summary

我试图找出一种基于行标识符执行数学运算的优化方法。

样本数据集如下:

A   B   C   D   E   F   G   H   I   J   K
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
1   1   2   1   1   2   1   2   1   1   2
1   1   2   1   1   2   1   2   1   1   2
1   1   2   1   1   2   1   2   1   1   2
1   1   2   1   1   2   1   2   1   1   2
2   1   2   1   1   2   1   2   1   1   2
2   1   2   1   1   2   1   2   1   1   2
2   1   2   1   1   2   1   2   1   1   2
2   1   2   1   1   2   1   2   1   1   2
3   1   2   1   1   2   1   2   1   1   2
3   1   2   1   1   2   1   2   1   1   2
3   1   2   1   1   2   1   2   1   1   2
3   1   2   1   1   2   1   2   1   1   2
4   1   2   1   1   2   1   2   1   1   2
4   1   2   1   1   2   1   2   1   1   2
4   1   2   1   1   2   1   2   1   1   2
4   1   2   1   1   2   1   2   1   1   2

我想根据列A找到行总和。因此,最终输出将有四行:

A   B   C   D   E   F   G   H   I   J   K
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
1   4   8   4   8   4   8   4   8   4   8
2   4   8   4   8   4   8   4   8   4   8
3   4   8   4   8   4   8   4   8   4   8
4   4   8   4   8   4   8   4   8   4   8

因为,真实数据集很大。我无法清楚地思考如何遍历所有数据集并完成所需的操作。上面sum只是一个例子,我会做更复杂的操作。关键是基于行键对数据进行子集化,然后执行操作,存储然后继续执行直到达到最后一行键为止。

任何建议都会有所帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

来自dplyr的解决方案。如果要进行更复杂的操作,例如将不同的函数应用于不同的列。 summarise_atsummarise_if可能比summarise_all更合适。但是,在我们看到这种情况的良好可重复的示例和问题陈述之前,不可能开发出特定的解决方案。

library(dplyr)

dt2 <- dt %>%
  group_by(A) %>%
  summarise_all(funs(sum(.)))

dt2
# A tibble: 5 x 11
      A     B     C     D     E     F     G     H     I     J     K
  <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1     0     0     0     0     0     0     0     0     0     0     0
2     1     4     8     4     4     8     4     8     4     4     8
3     2     4     8     4     4     8     4     8     4     4     8
4     3     4     8     4     4     8     4     8     4     4     8
5     4     4     8     4     4     8     4     8     4     4     8

更新

这是来自@Wen

的基本R方法
dt2 <- aggregate(.~ A, data = dt, FUN = sum)

来自data.table

的解决方案
library(data.table)

dt2 <- setDT(dt)[, lapply(.SD, sum), by = A]

数据

dt <- read.table(text = "A   B   C   D   E   F   G   H   I   J   K
0   0   0   0   0   0   0   0   0   0   0
                 0   0   0   0   0   0   0   0   0   0   0
                 0   0   0   0   0   0   0   0   0   0   0
                 1   1   2   1   1   2   1   2   1   1   2
                 1   1   2   1   1   2   1   2   1   1   2
                 1   1   2   1   1   2   1   2   1   1   2
                 1   1   2   1   1   2   1   2   1   1   2
                 2   1   2   1   1   2   1   2   1   1   2
                 2   1   2   1   1   2   1   2   1   1   2
                 2   1   2   1   1   2   1   2   1   1   2
                 2   1   2   1   1   2   1   2   1   1   2
                 3   1   2   1   1   2   1   2   1   1   2
                 3   1   2   1   1   2   1   2   1   1   2
                 3   1   2   1   1   2   1   2   1   1   2
                 3   1   2   1   1   2   1   2   1   1   2
                 4   1   2   1   1   2   1   2   1   1   2
                 4   1   2   1   1   2   1   2   1   1   2
                 4   1   2   1   1   2   1   2   1   1   2
                 4   1   2   1   1   2   1   2   1   1   2",
                 header = TRUE)