2017-12-17 23 views
2

私はrのようなデータフレームを持っています。文字列を抽出し、rの他の列に塗りつぶします。

df<-data.frame(matrix(NA, nrow = 4, ncol = 4)) 

df[,1]<-c("472=20140112224524497,5752=122524,223=ZHRR6,69=0," 
     ,"472=20140112224606569,223=BNCG6,315=CC26R,69=22," 
     ,"50=986,472=20140112224607924,223=ZHCG6,69=98," 
     ,"66=2315,472=20140112224502367,379=2016,223=CMCG9,69=274,") 

私が望むのは、最初の列から文字列を抽出し、各行の2番目から4番目の列までを埋めることです。

カラム2、472 =と最初の "、"の間に文字列が必要です。

カラム3、私は223 =とそのあとの最初の "、"の間の文字列が必要です。

カラム4、私は69 =と最初の "、"の間の文字列が必要です。

データにパターンはなく、値は整数またはアルファベットのいずれかです。

私の現在のコードは次のとおりです。

df[,2:4]<-c(unlist(ex_between(df$X1, c('472='), c(','), extract=TRUE)) 
      ,unlist(ex_between(df$X1, c('223='), c(','), extract=TRUE)) 
      ,unlist(ex_between(df$X1, c('69='), c(','), extract=TRUE))) 

このコードは動作します。ただし、1日に100万行以上あり、12個の列を埋める必要があるため、非常に遅いです。

誰かがプロセスを修正してスピードアップすることができたら、本当に感謝しています。私たちは、正規表現に続く番号と一致するパターンを指定str_extract\\d+)を使用することができます

どうもありがとう、

+0

各行にstrsplitをカンマで入力してください。また、適用する必要がありますか、または行ごとに機能します – Rockbar

答えて

3

は数(\\d)は=

library(stringr) 
df[-1] <- do.call(rbind, str_extract_all(df$X1, "(?<=\\d\\=)[^,]+")) 

または使用することによって、その後の後読みtstrsplitからdata.table

library(data.table) 
setDT(df)[, (2:4) := tstrsplit(X1, "\\d+=|,")[c(FALSE, TRUE)]] 
関連する問題