我有两个数据帧
final.dropna(inplace=True)
我正在尝试将df1 = data.frame( Id=c(1, 2, 3), address = c(3130, 5234, 1400))
df2 = data.frame(Id=c(1,1,2, 3, 3), address = c(5300, 3130, 5430, 5500, 2410))
中的每个地址与df1
中具有匹配的df2
的每个地址进行匹配,如果匹配则返回一个Id
和一个{ {1}}(如果没有)。
因此结果将是True
答案 0 :(得分:1)
对于两个data.frame,请使用Id
将每行中的address
和paste
组合在一起,然后检查组合中是否还包含df1
的组合从df2
使用%in%
do.call(paste, df1[c("Id", "address")]) %in% do.call(paste, df2[c("Id", "address")])
#[1] TRUE FALSE FALSE
OR
df1$Id %in% merge(df1, df2, by = c("Id", "address"))$Id
#[1] TRUE FALSE FALSE
答案 1 :(得分:0)
sapply(1:nrow(df1), function(i) df1[i, 2] %in% df2[df2[,1] == df1[i, 1], 2])
尽管这会正确返回F,F,F。我认为您将3120和3130误认为是比赛。
答案 2 :(得分:0)
这是使用purrr
的解决方案:
library(purrr)
map2_df(df1, df2, ~ .x %in% .y) %>%
reduce(~ .x == .y)
#[1] TRUE FALSE FALSE
工作原理:
第一个函数调用map2_df(df1, df2, ~ .x %in% .y)
创建一个数据框,该数据框具有与df1
相同的形状,但填充有布尔值,指示布尔值表示df1
和df2
之间的共享成员身份: / p>
# A tibble: 4 x 2
Id address
<lgl> <lgl>
1 TRUE TRUE
2 TRUE FALSE
3 TRUE FALSE
第二个函数调用reduce(~ .x == .y)
通过等价折叠每一行并得出最终答案:
#[1] TRUE FALSE FALSE
通过执行按行等效,我们确保只有具有匹配的Id
值的值才可以返回TRUE
。