我需要将变量(字符串)拆分为不同的列。我的数据如下所示:
test.data <- data.frame(id=c(101,101,101,101,101),
level=c( "levels p3 trunk slide.level", "levels p3 shark.level",
"levels p3 wedge.level", "levels p3 tricky.level", "levels p4 annoying lever.level"),
badge=c( "springboard badge s", "lever badge s", "lever badge s",
"ramp badge s", "lever badge s"))
> test.data
id level badge
1 101 levels p3 trunk slide.level springboard badge s
2 101 levels p3 shark.level lever badge s
3 101 levels p3 wedge.level lever badge s
4 101 levels p3 tricky.level ramp badge s
5 101 levels p4 annoying lever.level lever badge s
我需要将“level”变量分为两个变量[pp,level]和“badge”变量分为两个变量[item,badge]。
我的数据应如下所示:
> test.data
id PP Level Item Badge
1 101 levels p3 trunk slide.level springboard badge s
2 101 levels p3 shark.level lever badge s
3 101 levels p3 wedge.level lever badge s
4 101 levels p3 tricky.level ramp badge s
5 101 levels p4 annoying lever.level lever badge s
请注意,test.data $ level变量以“space”开头。我试过strsplit()函数但无法解决它。有人可以帮忙吗?
最佳。
答案 0 :(得分:2)
我们可以使用extract
中的双tidyr
来执行此操作。对于“级别”列,我们会匹配一个单词(\\w+
),后跟一个或多个空格(\\s+
),后跟另一个单词(\\w+
),将其捕获为一个组(用括号((...)
)包裹,后跟一个或多个空格(\\s+
)并捕获其余字符((.*)
)。同样,我们可以将另一列与另一列分开正则表达式
library(tidyr)
extract(test.data, level, into = c('pp', 'level'), '(\\w+\\s+\\w+)\\s+(.*)') %>%
extract(badge, into = c('Item', 'Badge'), '(\\w+)\\s*(.*)')
# id pp level Item Badge
#1 101 levels p3 trunk slide.level springboard badge s
#2 101 levels p3 shark.level lever badge s
#3 101 levels p3 wedge.level lever badge s
#4 101 levels p3 tricky.level ramp badge s
#5 101 levels p4 annoying lever.level lever badge s