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