【问题标题】:conditional data table column sum in RR中的条件数据表列总和
【发布时间】:2020-11-29 13:52:25
【问题描述】:

我有一个如下的数据框:

structure(list(X1 = c(1, 0, 1, 0), X2 = c(0, 1, 1, 1), X3 = c(0, 
0, 0, 1), Val = c(2, 3, 4, 5)), class = "data.frame", row.names = c(NA, 
-4L))

我想创建一个输出数据框,其列与上述数据框相同(列“Val”除外)

现在,对于每一列(X1、X2 和 X3),

a) X1 列 => 当 X1 = 1 且 X1=0 时,求 'Val' 总和的差异。例如,当 X1=1 并且 'Val' 和 = 2+4 = 6 时有 2 行 同样,当 X1=0 和 'Val' sum = 3+5=8 时,又有 2 行 输出数据框在“X1”列下的值 = 6-8 = -2

b) 当 X2=1 => 3+4+5=12 时,X2 列 => 'Val' 总和,当 X2=0 => 2 时,'Val' 总和。输出数据帧将有 12-2=10在“X2”列下

同样,对于列“X3”

输出数据框如下所示

structure(list(X1 = -2, X2 = 10, X3 = -4), class = "data.frame", row.names = c(NA, 
-1L))  

我们可以在这里寻找一些数据表解决方案吗?

【问题讨论】:

    标签: r datatable


    【解决方案1】:

    您可以将零替换为负数,然后将这些列乘以 val 列并使用 apply 对每一列求和。

    df = as.data.table(df)
    
    df[df == 0] = -1
    df = df[, !"Val"] * df$Val
    apply(df,2, sum)
    # X1 X2 X3 
    # -2 10 -4
    

    【讨论】:

      【解决方案2】:

      这是dplyr的选项

      library(dplyr)
      df1 %>%
         summarise(across(starts_with('X'), ~ sum(Val[. == 1]) - sum(Val[!.])))
      #  X1 X2 X3
      #1 -2 10 -4
      

      data.table

      library(data.table)
      setDT(df1)[, lapply(.SD, function(x) sum(Val[x == 1]) - 
             sum(Val[!x])), .SDcols = patterns('^X\\d+$')]
      #   X1 X2 X3
      #1: -2 10 -4
      

      【讨论】:

        猜你喜欢
        • 2021-03-24
        • 2013-02-09
        • 1970-01-01
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 2013-10-11
        • 2023-04-04
        • 2021-06-08
        相关资源
        最近更新 更多