簡體   English   中英

在R中沒有循環的情況下匹配多個條件

[英]Match with multiple criteria without loop in R

我有一個顯示一組條件的數據框,例如:

B = data.frame(col1 = 1:10, col2 = 11:20 )

例如,第一行表示當col1 = 1時,col2 = 11.我還有另一個數據框,其中包含應滿足這些條件的數字,例如:

A = data.frame(col1 = c(1:11,1:11), col2 = c(11:21,11:21), col3 = 101:122)

對於B中條件的所有行,我想返回矩陣Acol3中值的總和。例如,使用B中的第一行,該值為:

sum(A$col3[which(A$col1 == B$col1[1] & A$col2 == B$col2[1])])
#[1] 213

這是A的第1行和第12行中col3中條目的總和。 我需要為矩陣A所有行找到一個包含所有這些和的向量。 我知道如何用循環來做這個,但是在我的數據矩陣AB非常大並且有很多條件,所以我想知道是否有辦法在沒有循環的情況下做同樣的事情。 謝謝。

基礎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

或者像單線一樣

A.summed.sub <- subset(aggregate(col3 ~ col1 + col2, data = A, sum), paste(col1, col2) %in% paste(B$col1, B$col2));

# 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

使用dplyr的解決方案。 A2是最終輸出。 這個想法是將值分組為col1col2並計算col3的總和。 semi_join是通過匹配B col1col2值來過濾數據幀。

library(dplyr)

A2 <- A %>%
  group_by(col1, col2) %>%
  summarise(col3 = sum(col3)) %>%
  semi_join(B, by = c("col1", "col2")) %>%
  ungroup()
A2
# # A tibble: 10 x 3
#     col1  col2  col3
#    <int> <int> <int>
#  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

我們可以做一個連接on使用data.table

library(data.table(
setDT(A)[B, .(col3 = sum(col3)), on = .(col1, col2), by = .EACHI]
#    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM