Сопоставьте имена с R для каждого элемента данных - PullRequest
2 голосов
/ 07 апреля 2020

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

data1 <- data.frame(names = c("ALBERT | ALBERTIS 2", 
                              "PIERRE | JEAN | ALBERT", 
                              "ALBERTOS"))
data2 <- data.frame(names_search = c("ALBERT", "PIERRE"))

Я хочу знать, что каждое целое СЛОВО data2 присутствует в data1. Новый столбец в data1 будет содержать совпадающие элементы. Поэтому я хочу получить такой результат, как:

data3 <- data.frame(names = c("ALBERT | ALBERTOS | ALBERT 2", 
                              "ALBERT | ALBERTOS | ALBE 2",
                              "PIERRE | PIERRE 2 | PIERRE_SECOND | PIERRE_SECOND 2"), 
                    names_search = c("ALBERT", "ALBERT | PIERRE", ""))

У вас есть идеи, как это сделать?

Я пробовал это в два раза l oop (надеюсь, вы можете дать лучший способ) но это не удалось.

for( i in 1:nrow(data1)){
  result <- ""
  for(j in 1: nrow(data2)){
     present <- grepl(eval(parse(text = paste0('\\<',data2$names_search[j],'\\>'))), data1$names[i], fixed = T)
     # I check if the whole word data[j] is present in data1[i]

     if(present ==T){
       result <- paste(result, data2$names_search[j], sep= "|")

     }


  }
  data1$names_search[i] <- result

}

1 Ответ

1 голос
/ 07 апреля 2020

Мы можем разбить строки (т.е. каждую строку) на " | ", используя strsplit; после этого мы просто задаем для каждой итерации вектор соответствия data2, если он %in%. В конце if обрабатывает случай, когда нет совпадений, else paste s возвращает результат в нужную форму.

data1 <- transform(
  data1, 
  names_search=sapply(strsplit(as.character(data1$names), " | ", fixed=TRUE), function(x) {
    out <- x[x %in% data2$names_search]
    if (length(out) == 0) NA_character_
    else paste(out, collapse=" | ")
  }))

Result

data1
#                    names names_search
# 1    ALBERT | ALBERTIS 2   ALBERTIS 2
# 2 PIERRE | JEAN | ALBERT       PIERRE
# 3               ALBERTOS         <NA>

Данные

data1 <- structure(list(names = structure(c(1L, 3L, 2L), .Label = c("ALBERT | ALBERTIS 2", 
"ALBERTOS", "PIERRE | JEAN | ALBERT"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

data2 <- structure(list(names_search = structure(1:2, .Label = c("ALBERTIS 2", 
"PIERRE"), class = "factor")), class = "data.frame", row.names = c(NA, 
-2L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...