在 R 中匹配多个没有循环的条件

And*_*rew 3 conditional loops r match dataframe

我有一个显示一组条件的数据框,例如:

B = data.frame(col1 = 1:10, col2 = 11:20 )
Run Code Online (Sandbox Code Playgroud)

例如,第一行说当 col1 = 1 时,col2 = 11。我还有另一个数据框,其中的数字应该满足这些条件,例如:

A = data.frame(col1 = c(1:11,1:11), col2 = c(11:21,11:21), col3 = 101:122)
Run Code Online (Sandbox Code Playgroud)

我想为满足 B 中条件的所有行返回col3矩阵中值的总和A。例如,使用 B 中的第一行这个值是:

sum(A$col3[which(A$col1 == B$col1[1] & A$col2 == B$col2[1])])
#[1] 213
Run Code Online (Sandbox Code Playgroud)

col3第 1 行和第 12 行中条目的总和A。我需要为 matrix 的所有行找到一个包含所有这些总和的向量A。我知道如何用循环来做到这一点,但是在我的数据矩阵中A并且B非常大并且有很多条件,所以我想知道是否有办法在没有循环的情况下做同样的事情。谢谢你。

Mau*_*ers 6

基础 R 中的解决方案

# Sum identical rows
A.summed <- aggregate(col3 ~ col1 + col2, data = A, sum);

# Select col1 col2 combinations that are also present in B 
A.summed.sub <- subset(A.summed, paste(col1, col2) %in% paste(B$col1, B$col2));
#   col1 col2 col3
#1     1   11  213
#2     2   12  215
#3     3   13  217
#4     4   14  219
#5     5   15  221
#6     6   16  223
#7     7   17  225
#8     8   18  227
#9     9   19  229
#10   10   20  231
Run Code Online (Sandbox Code Playgroud)

或者和单线一样

A.summed.sub <- subset(aggregate(col3 ~ col1 + col2, data = A, sum), paste(col1, col2) %in% paste(B$col1, B$col2));
Run Code Online (Sandbox Code Playgroud)
# Add summed col3 to dataframe B by matching col1 col2 combinations
B$col3 <- A.summed[match(paste(B$col1, B$col2), paste(A.summed$col1, A.summed$col2)), "col3"];
B;
#   col1 col2 col3
#1     1   11  213
#2     2   12  215
#3     3   13  217
#4     4   14  219
#5     5   15  221
#6     6   16  223
#7     7   17  225
#8     8   18  227
#9     9   19  229
#10   10   20  231
Run Code Online (Sandbox Code Playgroud)