2017-12-21 15 views
2

3列のデータセットがあり、15565の観測値があります。列の1つに同じ行に複数の単語があります。 私が探しているのは、各行から特定の単語を抽出し、それを新しい列に追加することです(合計4列あります)。 問題は、私が探している単語が同じではなく、常に同じ位置にあるとは限りません。n行から文字列から単語を抽出し、その単語を新しい列として追加する

x y z 1 T 3C00652722 (T558799A) 2 T NA >> MSP: T0578836A & 3C03024632 3 T T0579010A, 3C03051500, EAET03051496 4 U T0023231A > MSP: T0577506A & 3C02808556 8 U (T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502

私は3Cで始まり、10文字の長されているすべての単語を抽出し、それは次のようになりますので、新しいCOLに追加する探しています:ここ は私のDSの抽出物である

x y z R
1 T 3C00652722 (T558799A) 3C00652722 2 T NA >> MSP: T0578836A & 3C03024632 3C03024632 3 T T0579010A, 3C03051500, EAET03051496 3C03051500 4 U T0023231A > MSP: T0577506A & 3C02808556 3C02808556 8 U >POPMigr.T576447A,C72/221816*3C00721502 3C00721502

私は無駄でstringr gprepライブラリを使用して試してみました。

答えて

5

akrun'sソリューションは、ちょうど私がstringrライブラリとsubstring法に基づいて、別の解決策を掲載していますため、シンプルかつエレガントな方法ですが私たちはstr_extract

library(stringr) 
df1$R <- str_extract(df1$z, "\\b3C[^, ]{8}") 
df1$R 
#[1] "3C00652722" "3C03024632" "3C03051500" "3C02808556" "3C00721502" 
+3

であり、私はこれがうまく入力がパターンに一致しない場合がありますケースを処理しません 'gsub'を、使用することが好ましいと思います。 'str_extract'は' NA'を返します。これは不一致+1のためのまともなプレースホルダです。 –

+0

@akrunあなたは神の仲間です!ありがとうございます!私はこの仕事をしようとしている最後の24時間私の頭を叩いている! –

+1

@RaulGonzalesそれが助けられたことを知ってうれしい。私は常習を通じたプログラミングに情熱を持っている普通の人です... – akrun

2

でこれを行うことができます。

library(stringr) 

x <- c(1,2,3,4,8) 
y <- c('T','T','T','U','U') 
z <- c('3C00652722 (T558799A)', 'NA >> MSP: T0578836A & 3C03024632', 'T0579010A, 3C03051500, EAET03051496', 
    'T0023231A > MSP: T0577506A & 3C02808556', '(T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502') 

dt <- data.frame(x,y,z) 

charLoc <- str_locate(pattern = "3C", dt$z) 
idx <- list() 
for (s in 1:dim(charLoc)[1]) { 
    idx[s] <- substring(dt$z[s], first = charLoc[s,][1], last = charLoc[s,][1]+9) 
} 
dt$val <- sapply(idx, paste0, collapse=",") 
print(head(dt)) 

と同じの出力が

x y               z  val 
1 1 T          3C00652722 (T558799A) 3C00652722 
2 2 T       NA >> MSP: T0578836A & 3C03024632 3C03024632 
3 3 T       T0579010A, 3C03051500, EAET03051496 3C03051500 
4 4 U      T0023231A > MSP: T0577506A & 3C02808556 3C02808556 
5 8 U (T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502 3C00721502 
関連する問題