2016-03-25 8 views
2

を以下の場合を除き、文字に基づくスプリットは私がに基づいて、このベクトルの各要素を分割したいRのstrsplit:特定の文字は

split_these = c("File Location:C:\\Documents","File Location:Pete's Computer","File Location:") 

のような文字列のベクトルを持っていると言う「:」ときを除き、それに続いて "\"が続きます。私が欲しいのは、私は否定先読みアサーションとPCREsを使用することをお勧めし

strsplit(split_these, ":") 
[[1]] 
[1] "File Location" "C"    "\\Documents" 

[[2]] 
[1] "File Location" "Pete Computer" 

[[3]] 
[1] "File Location" 

strsplit(split_these, ":[^\\]") 
[[1]] 
[1] "File Location" ":\\Documents" 

[[2]] 
[1] "File Location" "ete Computer" 

[[3]] 
[1] "File Location:" 

答えて

3

を以下

#preferred solution 
"File Location" "C:\\Documents" 
"File Location" "Pete's Computer" 
"File Location" "" 

または

#less preferred but still great 
"File Location" "C:\\Documents" 
"File Location" "Pete's Computer" 
"File Location" 

私が試したようなものを返す何かのためです。また、R文字列と正規表現構文の両方でメタ文字として機能するため、バックスラッシュを二重エスケープする必要があることにも注意してください。

strsplit(perl=T,split_these,':(?!\\\\)'); 
## [[1]] 
## [1] "File Location" "C:\\Documents" 
## 
## [[2]] 
## [1] "File Location" "Pete's Computer" 
## 
## [[3]] 
## [1] "File Location" 

あなたは、単一の文字ベクトルにリストを簡素化したい場合:

do.call(c,strsplit(perl=T,split_these,':(?!\\\\)')); 
## [1] "File Location" "C:\\Documents" "File Location" "Pete's Computer" "File Location" 

私は、末尾の空の文字列フィールドを取得するハックを考え出しました。 strsplit()は常に最後の空のフィールドを省略しているので、各入力文字列の最後に区切り文字を連結することができます。元の文字列に後続の区切り文字がない場合は、新しい空のフィールドは省略され、結果は変更されません。 は、元の文字列の末尾の区切り文字があったなら、私たちは私たちが望む空のフィールドを取得します:

do.call(c,strsplit(perl=T,paste0(split_these,':'),':(?!\\\\)')); 
## [1] "File Location" "C:\\Documents" "File Location" "Pete's Computer" "File Location" "" 
0

反復処理をread.dcfsplit_theseの要素を介してデータに改質することができという名前の文字ベクトルを与えます.frame:

v <- drop(do.call("cbind", lapply(split_these, function(x) read.dcf(textConnection(x))))) 

寄付:

> v 
    File Location  File Location  File Location 
    "C:\\Documents" "Pete's Computer"    "" 

または

> stack(v)[2:1] 

与える:

  ind   values 
1 File Location C:\\Documents 
2 File Location Pete's Computer 
3 File Location 
関連する問題