【问题标题】:Run Subset Data Before Performing Math Operation Based on Row Value在基于行值执行数学运算之前运行子集数据
【发布时间】:2017-09-17 02:37:00
【问题描述】:

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

样本数据集如下:

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只是一个例子,我会做更复杂的操作。关键是根据行键对数据进行子集化,然后执行操作,存储,然后一直这样做,直到到达最后一个行键。

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

【问题讨论】:

    标签: r dataframe subset summary


    【解决方案1】:

    来自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)
    

    【讨论】:

    • @Wen Me 也没有。
    • @Wen - 我拥有的数据具有非零值。我刚刚在这里写了0 以获得更清晰的可重复数据,这些值仅用于我在上面的问题中写的复杂数学。
    • @ChetanArvindPatil 那么我认为,通过使用ycw的回答可以解决你的问题~
    • @ycw - 谢谢。如果由于系统问题无法使用 dplyr 怎么办?可能与基础包有关吗?我使用的是基于 Spotfire (TERR) 的企业版工具,它与 dplyr 存在问题,我不知道为什么。
    • @ChetanArvindPatil 然后你可以试试aggdata &lt;- aggregate(.~ A, data = dt, FUN = sum)
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多