我想基于两个变量在两个不同的数据集中找到匹配的观测值。
第一个数据集“ 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
答案 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
中的MarkerID
和data.frame
条目连接起来,并使用match
来标识匹配的行; ifelse
用1
标记匹配项,而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