2017-05-27 45 views
0

我從data.frame 「轉換」 到data.tableR:GSUB和data.tables

str_split_fixed我現在有一個data.table:

library(data.table) 


DT = data.table(ID = c("ab_cd.de","ab_ci.de","fb_cd.de","xy_cd.de")) 
DT 

     ID 
1: ab_cd.de 
2: ab_ci.de 
3: fb_cd.de 
4: xy_cd.de 

new_DT<- data.table(matrix(ncol = 2)) 
colnames(new_DT)<- c("test1", "test2") 

我想先:在每個條目之後刪除「.de」,並在下一步中用下劃線分隔每個條目並將輸出保存在兩個新列中。最終的輸出應該是這樣的:

test1 test2 
1 ab cd 
2 ab ci 
3 fb cd 
4 xy cd 

在data.frame我所做的:

df = data.frame(ID = c("ab_cd.de","ab_ci.de","fb_cd.de","xy_cd.de")) 
df 

     ID 
1: ab_cd.de 
2: ab_ci.de 
3: fb_cd.de 
4: xy_cd.de 


df[,1] <- gsub(".de", "", df[,1], fixed=FALSE) 
df 

     ID 
1: ab_cd 
2: ab_ci 
3: fb_cd 
4: xy_cd 



n <- 1 
for (i in (1:length(df[,1]))){ 
    new_df[n,] <-str_split_fixed(df[i,1], "_", 2) 
    n <- n+1 
} 
new_df 

    test1 test2 
1 ab cd 
2 ab ci 
3 fb cd 
4 xy cd 

任何幫助表示讚賞!

回答

2

您可以sub刪除後綴(由Matchi.com提供回到)後使用tstrsplit到列分成兩個:

DT[, c("test1", "test2") := tstrsplit(sub("\\.de", "", ID), "_")][, ID := NULL][] 

# test1 test2 
#1: ab cd 
#2: ab ci 
#3: fb cd 
#4: xy cd 
+0

我最終需要[]什麼? – Rivka

+1

'[]'這裏是一個把結果打印出來的技巧。作爲':='修改列的位置但不返回任何內容。如果你不需要打印,那麼你不需要打印。 – Psidom

+0

我需要重複每行5次。我試過......:= rep(tstrsplit(sub .....),16)'但是這是添加列,而不是行 – Rivka

1

我們可以使用extracttidyr

library(tidyr) 
df %>% 
    extract(ID, into = c('test1', 'test2'), '([^_]+)_([^.]+).*') 
# test1 test2 
#1 ab cd 
#2 ab ci 
#3 fb cd 
#4 xy cd 

或使用data.table

library(data.table) 
DT[, .(test1 = sub('_.*', '', ID), test2 = sub('[^_]+_([^.]+)\\..*', '\\1', ID))] 
# test1 test2 
#1: ab cd 
#2: ab ci 
#3: fb cd 
#4: xy cd