匹配来自两个不同数据集的相应观测值

时间:2018-06-20 11:01:36

标签: r

我想基于两个变量在两个不同的数据集中找到匹配的观测值。

第一个数据集“ df1”存在以下两个变量:

SessionID   MarkerID
14  5
14  5
14  5
14  8
17  9
17  9
17  8
17  2
17  9

其他数据集“ df2”存在相同的两个变量

SessionID   MarkerID
14  5
17  8
17  2

现在,我想向df1添加另一个变量“ Match”,以显示是否在两个数据集(匹配= 1)(未找到匹配)(匹配= 0)之间找到了匹配项。会话ID和标记ID的观察值应具有相同的值。

所需的输出如下:

SessionID   MarkerID    Match
14  5    1
14  5    1
14  5    1
14  8    0
17  9    0
17  9    0
17  8    1
17  2    1
17  9    0

可复制的示例:

SessionID <- c(14,14,14,14,17,17,17,17,17)
MarkerID <- c(5,5,5,8,9,9,8,2,9)
df1 <- as.data.frame(cbind(SessionID, MarkerID))

SessionID <- c(14,17,17)
MarkerID <- c(5,8,2)
df2 <- as.data.frame(cbind(SessionID,MarkerID))

我尝试了以下代码,但未产生所需的输出:

df1$Match <- 0 
df1$Match[which(df1$MarkerID == df2$MarkerID & df1$SessionID == df2$SessionID )] <- 1

3 个答案:

答案 0 :(得分:1)

这里有可能使用match

df1$Match <- ifelse(is.na(match(
    paste0(df1$SessionID, df1$MarkerID, sep = "_"),
    paste0(df2$SessionID, df2$MarkerID, sep = "_"))), 0, 1)
df1;
#  SessionID MarkerID Match
#1        14        5     1
#2        14        5     1
#3        14        5     1
#4        14        8     0
#5        17        9     0
#6        17        9     0
#7        17        8     1
#8        17        2     1
#9        17        9     0

说明:我们将两个SessionID中的MarkerIDdata.frame条目连接起来,并使用match来标识匹配的行; ifelse1标记匹配项,而NA标记0(不匹配)项。

如果您想避免使用ifelse,也可以这样做

df1$Match <- as.numeric(!is.na(match(
    paste0(df1$SessionID, df1$MarkerID, sep = "_"),
    paste0(df2$SessionID, df2$MarkerID, sep = "_"))))

答案 1 :(得分:1)

这对我有用:

df1$Match <- as.numeric(do.call(paste, c(df1, sep = "-")) %in% do.call(paste, c(df2, sep = "-")))

答案 2 :(得分:0)

您可以使用left_join

df1 %>%
 left_join(df2 %>% mutate(Match = 1), by = c('SessionID', 'MarkerID')) %>%
 mutate(Match = ifelse(is.na(Match), 0 , Match))

#      SessionID MarkerID Match
# 1        14        5     1
# 2        14        5     1
# 3        14        5     1
# 4        14        8     0
# 5        17        9     0
# 6        17        9     0
# 7        17        8     1
# 8        17        2     1
# 9        17        9     0