通过行进ID将行与子集匹配

时间:2018-11-30 16:30:03

标签: r matching

我有两个数据帧

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

3 个答案:

答案 0 :(得分:1)

对于两个data.frame,请使用Id将每行中的addresspaste组合在一起,然后检查组合中是否还包含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相同的形状,但填充有布尔值,指示布尔值表示df1df2之间的共享成员身份: / 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