Соответствие строк подмножеству по идентификатору перехода - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть два фрейма данных

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, и возвращает Trueесли он совпадает и False, если нет.

Таким образом, результат будет TRUE, FALSE, FALSE

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Для обоих 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

ИЛИ

df1$Id %in% merge(df1, df2, by = c("Id", "address"))$Id
#[1]  TRUE FALSE FALSE
0 голосов
/ 30 ноября 2018

Вот решение, использующее 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:

  # 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.

0 голосов
/ 30 ноября 2018
sapply(1:nrow(df1), function(i) df1[i, 2] %in% df2[df2[,1] == df1[i, 1], 2])

Хотя это возвращает F, F, F правильно.Я думаю, что вы приняли 3120 и 3130 за матч.

...