2017-05-27 8 views
0

にstr_split_fixed私は今data.tableを持ってdata.tableR:GSUBとdata.tables

にdata.frameから "変換" しています:

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"を削除し、次のステップでアンダースコアですべてのエントリを区切り、2つの新しいカラムに出力を保存します。最終的な出力は次のようになります。data.frameで

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

私がやった:

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と接尾辞(.DE)を除去した後、2に列を分割する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

我々はextract

tidyrから
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