我有一个列变量,我想分成三个因子变量。有我要创建的因子变量:
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个条目,因此,我对此表示感谢。 谢谢!
答案 0 :(得分:2)
我们可以定义一个函数,以查找因子变量的位置,该变量用作正则表达式时,可以在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
答案 1 :(得分:0)
使用tidyverse工具(例如管道%>%和dplyr)进行此操作:
Separate使用您指定的分隔符将代码列分成两部分。
因为“ \”是正则表达式中的特殊字符,所以您必须转义每个要查找的\。
Spread可以根据需要将其从高大的形式转换为宽大的形式。
library(dplyr)
df %>%
separate(code, into = c("colName", "value"), sep = "\\\\\\\\") %>%
spread(colName, value)