SUMIF列A如果列B大于或等于另一个数据帧中的列C.

时间:2017-08-24 09:05:05

标签: r sum iteration conditional

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

通过基础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