2012-07-17 32 views
1

假設我有以下數據幀拆分值並將其添加爲額外的行

> df <- data.frame(var1 = c("A", "B", "C", "D"),    
       var2 = c("test", "5 | 6", "X & Y", "M | N | O")) 
> df 
    var1   var2 
1 A   test 
2 B   5 | 6 
3 C   X & Y 
4 D  M | N | O 

我怎麼能在var2|&運營商拆分值並將它們作爲單獨的行放入same data.frame。輸出應該如下所示:

> df 
    var1   var2 
1 A   test 
2 B    5 
3 B    6 
4 C    X 
5 C    Y 
6 D    M 
7 D    N 
8 D    O 

我用strsplit和一個for循環來實現它。不過,我認爲這不是很好編碼。任何想法如何以更好的R方式實現這一點?

回答

6

你可以做這樣的事情:

s <- strsplit(df[,2], " \\| | & ") 
cbind(var1=rep(df[,1], sapply(s, length)), var2=unlist(s)) 
    var1 var2 
[1,] "A" "test" 
[2,] "B" "5" 
[3,] "B" "6" 
[4,] "C" "X" 
[5,] "C" "Y" 
[6,] "D" "M" 
[7,] "D" "N" 
[8,] "D" "O" 
+0

+1幹得好。您可以非常感謝'|'以及'&' – Andrie 2012-07-17 07:53:01

+0

,感謝那個偉大的解決方案!非常感謝! – user969113 2012-07-17 09:15:57

1

另一種方法是使用cSplit從我的 「splitstackshape」 套餐:

library(splitstackshape) 
cSplit(df, "var2", "[|&]", "long", fixed = FALSE)[var2_new != ""] 
# var1 var2_new 
# 1: A  test 
# 2: B  5 
# 3: B  6 
# 4: C  X 
# 5: C  Y 
# 6: D  M 
# 7: D  N 
# 8: D  O 
+0

嗯,你不能做'cSplit(df,「var2」,「[|&]」,「long」,fixed = FALSE)? – 2014-12-23 16:56:13

+0

@RichardScriven,這樣對你有用嗎?似乎它需要調整。 – A5C1D2H2I1M1N2O1R2T1 2014-12-25 06:37:14

+0

是的,在我的機器上您的答案錯誤,但我的評論工作。版本1.4.2。當我從調用結束時刪除子集時,列仍爲'var1'和'var2'。我會在聊天中告訴你 – 2014-12-25 06:42:59