Сопоставьте строку в столбцах двух фреймов данных и создайте новый столбец - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь сопоставить столбец State в df2 со столбцом State в df1:

  • количество строк в обоих кадрах данных неравно.
  • столбец State df2 содержит несколько значений, разделенных запятыми.
  • , когда одно из значений из df2 совпадает со значениями в df1, я хочу соответствующее значениев новом столбце Verified_State. Примечание. Это фиктивные данные.Наименьшее количество шансов на более чем одно совпадение в одной строке.

Ввод выглядит следующим образом:

df1
  CustomerId State
           1 Alabama
           2 Maryland
           3 Ohio
           4   Texas
           5   California
           6   Alabama

df2
  CustomerId   State
           2 Alabama,North Caroline, Virginia
           4 Alabama, West Virginia
           6    Ohio, Kentucky`

Желаемый вывод:

df3
  CustomerId   State                            Verified_State
           2 Alabama,North Caroline, Virginia     Alabama
           4 Alabama, West Virginia               Alabama
           6    Ohio, Kentucky                    Ohio

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

A tidyverse возможность.Мы используем separate_rows для разделения значений через запятую на разные строки, а затем выясняем, какие State присутствуют в df1 для каждого CustomerId, а затем выбираем только первое совпадение.

library(tidyverse)

bind_cols(df2, Verified_State = 
df2 %>%
   separate_rows(State) %>%
   group_by(CustomerId) %>%
   summarise(Verified_State = df1$State[which.max(df1$State %in% State)]) %>%
   pull(Verified_State))


#  CustomerId                          State Verified_State
#1          2 Alabama,NorthCaroline,Virginia        Alabama
#2          4           Alabama,WestVirginia        Alabama
#3          6                  Ohio,Kentucky           Ohio

Вышеуказанное будет работать, если в каждой строке будет хотя бы одно совпадение.Если может быть случай, когда совпадения вообще нет, мы можем проверить этот случай с условием if

bind_cols(df2, Verified_State = 
df2 %>%
   separate_rows(State) %>%
   group_by(CustomerId) %>%
   summarise(Verified_State = if(any(df1$State %in% State)) 
   df1$State[which.max(df1$State %in% State)] else NA) %>%
   pull(Verified_State))
0 голосов
/ 05 марта 2019

Вы можете легко добиться этого, используя grep.Ниже приведен пример в базе R:

> df1 <- data.frame(State = c("Alabama", "Maryland"), stringsAsFactors = FALSE)
> df2 <- data.frame(State = c("Alabama,North Caroline, Virginia",
+                             "Ohio, Kentucky"), stringsAsFactors = FALSE)
> 
> state_list <- unlist(strsplit(paste(df2$State, collapse = " "), ","))
> state_list
[1] "Alabama"        "North Caroline" " Virginia Ohio" " Kentucky"     
> 
> df1$Verified_State <- sapply(df1$State, function(x) {
+   grep(x, state_list, value = T)[1]
+ }, USE.NAMES = F)
> 
> df1
     State Verified_State
1  Alabama        Alabama
2 Maryland           <NA>

Это предполагает, что вам нужно только первое совпадение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...