2017-04-05 110 views
0

我需要將我的變量(字符串)分成不同的列。我的數據是這樣的:在R中分割字符串變量

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 

我需要拆分「級別」變到兩個變量[PP,電平]和「徽章」變到兩個變量[項目,徽章。

我的數據應該是這樣的:

> 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 $級變量與「空間」開始。我試過strsplit()函數,但無法解決它。有人可以幫忙嗎?

最好。

回答

2

我們可以用tidyr的雙重extract來做到這一點。對於'級別'列,我們匹配一個單詞(\\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 
+0

感謝您的解決方案,你能解釋一下做這個「(\\ w + \ \ s + \\ w +)\\ s +(。*)')代表? – amisos55

+0

@ amisos55我更新了一些描述的帖子。希望它有幫助 – akrun

+1

感謝您的幫助。不勝感激! – amisos55