如果 B 列大于或等于另一个数据框中的 C 列,则 SUMIF A 列

SUMIF Column A if Column B is greater than or equal to Column C in another dataframe

如果 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

我们可以试试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

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