【问题标题】:SUMIF Column A if Column B is greater than or equal to Column C in another dataframe如果 B 列大于或等于另一个数据框中的 C 列,则 SUMIF A 列
【发布时间】:2017-08-24 09:05:05
【问题描述】:

如果 df1 中第一列 [A] 中的相应值大于或等于 df2 中的值,我想对 df1 中的列中的值求和。我想在 df2 中执行此操作的值范围。

在 excel 中,公式看起来像: 一列的 SUMIF(df1$A,>=df2$Value,df1$B)。

df1:

  [A]    [B]    [C]
    1     10     20
    2     20     20
    3     20     30
    4     10     50
    5     30     10

df2:

Value
    1
    3
    5

输出:

Value   SUM[df1$B]   SUM[df1$C]
    1           90          130
    3           60           90
    5           30           10

【问题讨论】:

    标签: r sum iteration conditional


    【解决方案1】:

    我们可以试试base R。遍历'df2'的'Value'列,根据'A'列是否大于或等于'df2'中的值的条件对'df1'进行子集化,得到'B'和'的列总和C' 列,rbind list 元素来创建单个数据集

    res <- do.call(rbind, lapply(df2$Value, function(x) cbind(Value = x, 
                as.data.frame.list(colSums(df1[df1$A >= x, 2:3])))))
    names(res)[-1] <- paste0("SUM_", names(res)[-1])
    res
    #     Value SUM_B SUM_C
    #1     1    90   130
    #2     3    60    90
    #3     5    30    10
    

    或者另一个选项是data.table

    library(data.table)
    CJ(A=df1$A, Value = df2$Value)[A >= Value][df1, on = .(A)
                 ][, lapply(.SD, sum),Value, .SDcols = B:C]
    #   Value  B   C
    #1:     1 90 130
    #2:     3 60  90
    #3:     5 30  10
    

    【讨论】:

      【解决方案2】:

      基于 R 的想法,

      cbind(df2,  
            setNames(data.frame(t(sapply(df2$value, function(i) 
                                             sapply(2:ncol(df1), function(j) 
                                                       sum(df[i:nrow(df1), j]))))), 
                     paste0('SUM', '_', names(df1)[-1])))
      

      给出,

         value SUM_V2 SUM_V3
      1     1     90    130
      2     3     60     90
      3     5     30     10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        相关资源
        最近更新 更多