Частичное совпадение двух столбцов по строке в кадре данных - PullRequest
0 голосов
/ 02 марта 2019

У меня есть фрейм данных с Name1 (10 наблюдений) и Name2 с 3 наблюдениями.У меня есть следующий пример игрушки:

   Name1                            Name2         
Acadian Hospitals                 Wellington      
Bridgewater Trust Associates      Zeus        
Concordia Consulting              Acadian
Wellington Corporation LLC          .
Wellington Wealth Management        .
Prime Acadian Charity

Если Name1 может соответствовать части его строки в Name2, я хочу, чтобы вывод в column3 был TRUE.В настоящее время мой код работает только наоборот, используя pmatch

Мой окончательный вывод должен выглядеть следующим образом:

   Name1                            Name2           Is_Matched
Acadian Hospitals                 Wellington           TRUE
Bridgewater Trust Associates      Zeus                 FALSE
Concordia Consulting              Acadian              FALSE
Wellington Corporation LLC          .                  TRUE
Wellington Wealth Management        .                  TRUE
Prime Acadian Charity               .                  TRUE

Ответы [ 3 ]

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

Звучит так, будто Name2 - это просто набор значений для поиска.В этом случае вы можете построить поиск, вставив все значения вместе, а затем выполнить один простой grepl поиск по всем df$Name2:

df$Is_Matched <- grepl(paste(df$Name2[df$Name2 == "."], collapse = "|"), df$Name1)
#                         Name1      Name2 Is_Matched
#1            Acadian Hospitals Wellington       TRUE
#2 Bridgewater Trust Associates       Zeus      FALSE
#3         Concordia Consulting    Acadian      FALSE
#4   Wellington Corporation LLC          .       TRUE
#5 Wellington Wealth Management          .       TRUE
#6        Prime Acadian Charity          .       TRUE

Обратите внимание, что предполагается, что пропущенные значения в Name2кодируется как ".", а не NA.Было бы достаточно легко перейти на любую другую кодировку пропущенных значений.

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

С помощью Майка Х.:

Name1 = c("Bridgewater Trust Associates", "Acadian Wealth Management", "Wellington Wealth Trust", "Concordia University", "Southern Zeus College", "Parametric Modeling", "Wellington City Corporation", "Hotel Zanzibar") 
Name2 = c("Acadian", "Wellington", "Zeus")

max.len = max(length(Name1), length(Name2))
Name1 = c(Name1, rep(NA, max.len - length(Name1)))
Name2 = c(Name2, rep(NA, max.len - length(Name2)))
column3 <- grepl(paste(Name2, collapse = "|"), Name1)

df <- data.frame(Name1, Name2, column3, stringsAsFactors = FALSE)
0 голосов
/ 02 марта 2019

Вы можете использовать sapply.Без примера я думаю, что-то вроде этого должно работать.Я проверю пример через секунду.

df$Is_Matched <- sapply(df$Name2, function(x) any(grepl(x, df$Name1))

РЕДАКТИРОВАТЬ:

Помогло создание примера кадра данных.sapply экспортировал матрицу с каждым словом в Name2, имеющим свой собственный столбец.Таким образом, вы можете проверить, содержит ли строка строку true, используя rowSums (true = 1, false = 0).Дайте мне знать, если у вас есть какие-либо проблемы с этим.

> df <- data.frame(
+   Name1 = c("Acadian Hospitals", "Bridgewater Trust Associates",
+             "Concordia Consulting", "Wellington Corporation LLC",
+             "Wellington Wealth Management", "Prime Acadian Charity"),
+   Name2 = c("Wellington", "Zeus", "Acadian", NA, NA, NA),
+   stringsAsFactors = FALSE
+ )
> 
> match_me <- na.omit(df$Name2)
> df$Is_Matched <- rowSums(sapply(match_me, function(x) grepl(x, df$Name1))) > 0
> df
                         Name1      Name2 Is_Matched
1            Acadian Hospitals Wellington       TRUE
2 Bridgewater Trust Associates       Zeus      FALSE
3         Concordia Consulting    Acadian      FALSE
4   Wellington Corporation LLC       <NA>       TRUE
5 Wellington Wealth Management       <NA>       TRUE
6        Prime Acadian Charity       <NA>       TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...