какой шаблон из строки соответствует другой строке - PullRequest
0 голосов
/ 16 января 2019

У меня есть переменная столбца, которую я хочу разделить на три факторные переменные. Вот факторные переменные, которые я хочу создать:

goal<-c('newref', 'meow', 'woof')
area<-c('eco', 'social', 'bank')
fr<-c('demo', 'hist', 'util')

И текущая переменная выглядит примерно так:

code<-c('goal\\\\meow', 'area\\\\bank', 'area\\\\bank', 'fr\\\\utilitarian', 'fr\\\\history')

И скажем, датафрейм выглядит примерно так

df<-data.frame(var1=c(1,2,3,4,5), var2=c('a', 'b', 'c', 'd', 'e'), code=code)

Итак, я хотел бы создать 3 новых столбца, по одному на каждую переменную фактора, и использовать регулярное выражение, которое обнаружило, к чему оно относится. Так, например, строка номер один должна выглядеть следующим образом:

row1<-data.frame(var1=1, var2=c('a'), code=c('goal\\\\meow'), goal=2, area=NA, fr=NA)

Также обратите внимание, что значение факторных переменных является сокращением значения в коде (например, history / hist). В базе данных, вероятно, будет 10000 записей, поэтому я буду очень признателен за любые подсказки по этому поводу. Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

find_match <- function(code, matches) {
    apply(sapply(matches, grepl, code), 1, match, x=T)
}

Если совпадений нет, эта функция возвращает NA для этой строки.

Далее, мы можем просто использовать mutate из dplyr, чтобы добавить каждый столбец факторов:

df %>% mutate(goal = find_match(code, goal),
              area = find_match(code, area),
              fr = find_match(code, fr))

Что дает:

  var1 var2              code goal area fr
1    1    a      goal\\\\meow    2   NA NA
2    2    b      area\\\\bank   NA    3 NA
3    3    c      area\\\\bank   NA    3 NA
4    4    d fr\\\\utilitarian   NA   NA  3
5    5    e     fr\\\\history   NA   NA  2
0 голосов
/ 16 января 2019

Делаем это с помощью инструментов Tidyverse, таких как труба%>% и dplyr:

Разделяет столбец кода на два с указанным разделителем.

Поскольку "\" - это специальный символ в регулярном выражении, вы должны экранировать каждый \, который вы хотите найти, с другим.

Spread преобразует его из высокой формы в широкую по мере необходимости.

library(dplyr)
df %>% 
  separate(code, into = c("colName", "value"), sep = "\\\\\\\\") %>% 
  spread(colName, value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...