匹配data.frame中的多个变量

时间:2015-10-20 10:34:10

标签: r match

采取一些简单的数据

A <- 1:10
B <- 100:109
C <- 222:231
df1 <- data.frame(A,B,C)
df1$Z <- 1:length(A)

D <- c(2,3,4,6)
E <- c(101,202,104,105)
Ff <- c(223,999,225,227)
df2 <- data.frame(D,E,Ff)

现在我想创建df2$Z,当A == D和B == E和C == Ff时分配df1 $ D值,否则应用NA

我尝试使用此代码,但语法不正确:

df2$Z <- df1$Z[match(df1$A & df2$D & df1$B & df2$E & df1$C & df2$Ff)]

3 个答案:

答案 0 :(得分:2)

使用data.table我会做类似

的事情
library(data.table)
setkey(setDT(df2))[df1, Z := i.Z]
df2
#    D   E  Ff  Z
# 1: 2 101 223  2
# 2: 3 202 999 NA
# 3: 4 104 225 NA
# 4: 6 105 227  6

请注意,我们没有在df1上设置关键列,因此在df2的关键列和df1的前3列之间执行连接(即按位置) 。如果并不总是保证列顺序,那么也要在相应列上的df1上设置密钥。

另一种不需要设置密钥的方法(需要重新排序data.tables并不总是需要)是使用新实现的on=参数(在CRAN上的最新版本上可用 - v 1.9 0.6):

library(data.table) # V 1.9.6+
setDT(df2)[df1, Z := i.Z, on = c(D = "A", E = "B", Ff = "C")]
df2
#    D   E  Ff  Z
# 1: 2 101 223  2
# 2: 3 202 999 NA
# 3: 4 104 225 NA
# 4: 6 105 227  6

答案 1 :(得分:1)

使用左连接很容易

library(dplyr)
final <- df2 %>% 
  left_join(df1, by = c("D" = "A", "E" = "B", "Ff" = "C")) %>% 
  select(-D, D = D.y)

tmp将包含D来自原始df2和来自D.y的{​​{1}}。 df1移除select(-D)Dselect(D = D.y)重命名为D.yD首先删除select(-D, D = D.y),然后D删除D.y,并提供所需的结果。

D

答案 2 :(得分:1)

您可以执行的基础R - 列需要采用相同的顺序:

x = apply(df2,1,paste0, collapse='')
y = apply(df1[1:3],1, paste0, collapse='')

df2$Z = df1$Z[match(x,y)]

#  D   E  Ff  Z
#1 2 101 223  2
#2 3 202 999 NA
#3 4 104 225 NA
#4 6 105 227  6