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