Поиск совпадений по символам в R - PullRequest
0 голосов
/ 30 октября 2019

Учитывая два приведенных ниже вектора, есть ли способ создать желаемый кадр данных? Это представляет реальную ситуацию, с которой мне приходится сталкиваться во фреймах данных: первый содержит столбец со значениями базы данных (ключи), а второй содержит столбец из 1000+ строк, каждое из которых имеет имя файла (потенциалы), которое мне нужно сопоставить. Проблема в том, что может быть несколько файлов (потенциалов), соответствующих любому данному ключу. Я работал с grep, merge, inner join и т. Д., Но не смог объединить их в одно решение. Любой совет приветствуется!

potentials <- c("tigerINTHENIGHT",
            "tigerWALKINGALONE",
            "bearOHMY",
            "bearWITHME",
            "rat",
            "imatchnothing")
keys <- c("tiger",
            "bear",
            "rat")


desired <- data.frame(keys, c("tigerINTHENIGHT, tigerWALKINGALONE", "bearOHMY, bearWITHME", "rat"))
names(desired) <- c("key", "matches")

Псудо-код для того, что я считаю решением:

#new column which is comma separated potentials
# x being the substring length i.e. x = 4 means true if first 4 letters match
function createNewColumn(keys, potentials, x){
  str result = na
  foreach(key in keys){
    if(substring(key, 0, x) == any(substring(potentals, 0 ,x))){ //search entire potential vector
      result += potential that matched + ', '
    }
  }
  return new column with result as the value on the current row
}

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Вы можете использовать grep

 > Match <- sapply(keys, function(item) {
                  paste0(grep(item, potentials, value = TRUE), collapse = ", ")
     } )     

> data.frame(keys, Match, row.names = NULL)
       keys                              Match
    1 tiger tigerINTHENIGHT, tigerWALKINGALONE
    2  bear               bearOHMY, bearWITHME
    3   rat                                rat
1 голос
/ 30 октября 2019

Мы можем написать небольшую функцию для извлечения совпадений, а затем выполнить цикл по клавишам:

return_matches <- function(keys, potentials, fixed = TRUE) {
  vapply(keys, function(k) {
    paste(grep(k, potentials, value = TRUE, fixed = fixed), collapse = ", ")
  }, FUN.VALUE = character(1))
}

vapply - это просто безопасная версия sapply, означающая, что она никогда не вернет ничего, кроме символьного вектора. ,Когда вы установите fixed = TRUE, функция будет работать намного быстрее, но больше не будет распознавать регулярные выражения. Тогда мы можем легко сделать желаемое data.frame:

df <- data.frame(
  key = keys,
  matches = return_matches(keys, potentials),
  stringsAsFactors = FALSE
)
df
#>         key                            matches
#> tiger tiger tigerINTHENIGHT, tigerWALKINGALONE
#> bear   bear               bearOHMY, bearWITHME
#> rat     rat                                rat

Причина, по которой цикл помещается в функцию, а не выполняется непосредственно, состоит в том, чтобы код выглядел чище.

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