向量加法和向量索引

时间:2018-12-14 13:25:59

标签: r

这很可能在其他地方有一个答案,但是我在表达问题的措辞以找到我需要的东西时遇到困难。

我有两个数据帧A和B,A的行比B多得多。我想根据A的列从B查找值,并将其添加到A的另一列。 / p>

A$ColumnToAdd + B[ColumnToMatch == A$ColumnToMatch,]$ColumnToAdd

但是我得到了很多NA:

Warning in `==.default`: longer object length is not a multiple of shorter object length

我可以使用凌乱的for循环来做到这一点,但是我正在寻找更快,更优雅的东西。

谢谢

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么您正在寻找mergejoin,如评论中的建议。

这是一个简单的示例,说明两者都使用了适合您描述的虚拟数据。

library(tidyverse)

# Some dummy data
ColumnToAdd <- c(1,1,1,1,1,1,1,1)
ColumnToMatch  <- c('a','b','b','b','c','a','c','d')
A <- data.frame(ColumnToAdd, ColumnToMatch)
ColumnToAdd <- c(1,2,3,4)
ColumnToMatch <- c('a','b','c','d')
B <- data.frame(ColumnToAdd, ColumnToMatch)

# Example using merge
A %>% 
  merge(B, by = c("ColumnToMatch")) %>%  
  mutate(sum = ColumnToAdd.x + ColumnToAdd.y)                    

# Example using join
A %>% 
  inner_join(B, by = c("ColumnToMatch")) %>% 
  mutate(sum = ColumnToAdd.x + ColumnToAdd.y)    

The advantages of the dplyr versions over merge are

  • 行保持现有顺序
  • 快得多
  • 告诉您要合并的密钥(如果不提供)
  • 还可以处理数据库表。