2016-09-13 21 views
0

Rを使用して情報を抽出するのに必要なファイル名のリストが多数あります。情報は複数のダッシュとアンダースコアで区切ります。区切り文字間の文字数が一貫していないという事実(情報の順序は、区切り文字が使用されている(希望通り)と同じように)が変わらないという事実に対応する方法を見つけ出すのに問題があります。例えば複数区切り文字で区切られた文字列の複数の変数への分割R

f <- data.frame(c("EI-SM4-AMW11_20160614_082800.wav", "PA-RF-A50_20160614_082800.wav"), stringsAsFactors = FALSE) 
colnames(f)<-"filename" 
f$area <- str_sub(f$filename, 1, 2) 
f$rec <- str_sub(f$filename, 4, 6) 
f$site <- str_sub(f$filename, 8, 12) 

これは、最初のファイルの正しい結果が、2番目のために誤った結果を生成します。

私は「stringr」と「stringi」のパッケージを使用してみました、そしてハードに値をコーディングすることは動作しませんので、私のような両方のパッケージを使用して厄介なソリューションを作ってみたことを知っていました:

f$site <- str_sub(f$filename, 
        stri_locate_last(f$filename, fixed="-")[,1]+1, 
        stri_locate_first(f$filename, fixed="_")[,1]-1) 

おそらくregex(これは私が痛感している)を含むよりエレガントな(そして堅牢な)方法が必要であるように感じます。

私は他の例(Extract part of string (till the first semicolon) in RR: Find the last dot in a stringSplit string using regular expressions and store it into data frame)を見てきました。

ご意見/ご要望があれば幸いです。

+1

自然言語には、これらのいずれの取り組みとも一致する説明はありません。 2つのダッシュのインスタンスと2つのアンダースコアのインスタンスがあり、2つまたは3つのアイテムのみが必要です。 _Describe_失敗したコードを提示するのではなく、何をあなたに伝えますか? –

答えて

1

`tidyr」パッケージから、これを試してみてください:

library(tidyr) 

f %>% separate(filename, c('area', 'rec', 'site'), sep = '-') 

そうようにあなたはまた、複数の差区切り文字に沿って分割することができます

f %>% separate(filename, c('area', 'rec', 'site', 'date', 'don_know_what_this_is', 'file_extension'), sep = '-|_|\\.') 

、その後はdplyrを使用して、必要な列のみを保ちますさんselect機能:このような

library(dplyr) 
library(tidyr) 

f %>% 
    separate(filename, 
      c('area', 'rec', 'site', 'date', 
       'don_know_what_this_is', 'file_extension'), 
      sep = '-|_|\\.') %>% 
    select(area, rec, site) 
+1

'separate'はデフォルトで任意の区切り文字で分割されます(2番目の例で定義しないとどうなるか)、定義した新しい列の数を超えて余分なものを削除します第2の「選択」ステップ。元の列を保持するには、 'remove = FALSE'を参照してください。 – aosmith

+0

ありがとうRoyalTS-私はこの仕事のために整頓を考えなかったが、この解決策は完全に働いた。区切り文字を定義しないようにaosmithの提案を使用しました。これは、ファイル接頭辞に奇妙なものを置く人々にとって、ソリューションをより堅牢にします。 (ファイル拡張子の前の最後のチャンクはhhmmssの時間です) – JMDR

0

は何か:

library(stringr) 
library(dplyr) 

f$area <- word(f$filename, 1, sep = "-") 
f$rec <- word(f$filename, 2, sep = "-") 
f$site <- word(f$filename, 3, sep = "-") %>% 
     word(1,sep = "_")   

dplyrは必要ではないが、連結クリーナーになります。 関数wordstringrに属します。

関連する問題