2016-07-20 27 views
-2

我創建中的R的簡單data.table基於函數,讓我插入所要求的數據幀,並且爲了創建額外的行,其中的完整列表擴展分割用分號(S)的值和其他列的條目保持不變。數據表分裂值誤差

splitSemicolons = function(x){ 
new_df <- data.table(x, key="SampleID") 
final_df <- new_df[, list(Identifier = unlist(strsplit(Identifier, ";"))), by=c('SampleID', 'Name')] 
} 

我的數據幀

>df 
SampleID, Name, Identifier 
1, John, PS897 
2, Mary, GF521 
3, George, DG636;DG637 
4, Helen, 
5, Patrick, WV168 

出於某種原因,在執行功能後的控制檯給我的錯誤; 「對象」標識符「找不到」,而不是傳遞下面的結果。奇怪的是,在代碼完美運行功能括號外,但在SampleID = 4像海倫空白值完全刪除的條目。

>desired_result 
SampleID, Name, Identifier 
1, John, PS897 
2, Mary, GF521 
3, George, DG636 
3, George, DG637 
4, Helen, 
5, Patrick, WV168 

回答

2

我們可以用cSplit從「寬」到「長」格式由分裂的分隔符(;)進行轉換,並指定stripWhite爲「假」,以確保空行不會被刪除。

library(splitstackshape) 
cSplit(df, "Identifier", ";", "long", stripWhite=FALSE) 
# SampleID  Name Identifier 
#1:  1  John  PS897 
#2:  2  Mary  GF521 
#3:  3 George  DG636 
#4:  3 George  DG637 
#5:  4 Helen   
#6:  5 Patrick  WV168 

或者,如果我們使用data.table的「data.frame」轉換爲「data.table」(setDT(df)),由;每行中多次重複行的序列,然後做通過「SampleID」分組和unique「標識符」的分割分配(:=)爲「標識符」列中。

library(data.table) 
library(stringr) 
setDT(df)[rep(1:.N,str_count(Identifier, ";")+1)][, 
      Identifier := strsplit(unique(Identifier), ";"), SampleID][] 
# SampleID  Name Identifier 
#1:  1  John  PS897 
#2:  2  Mary  GF521 
#3:  3 George  DG636 
#4:  3 George  DG637 
#5:  4 Helen   
#6:  5 Patrick  WV168