2017-12-01 17 views
2

複数の空白を持つ不均等な文字列を分割しようとしています。しかし、分割されるスペースの数は常に同じではない。Rは不均等な空白文字列を分割します

"abc   20" 
"csd 10" 
"eds  10  30" 

と私は次の取得しようとしている。これを行うにはどのように

"abc" " " "20" 
"csd" "10" " " 
"eds" "10" "30" 

任意のアイデア?固定された数のスペースに基づく分割は、これらが少し変わるため不可能であることに注意してください。私は、文字または数字の後ろに続くか、またはそれに続いて、ちょうど1つのスペースで分割することを考えていましたが、どうやってそれを行うのかわかりません。

+1

を最初のものは途中でスペースを持っている2つ目の終わりにスペースを持っていないのはなぜ? – Gregor

+0

最終的なデータは3つの変数のようになります。 2番目の変数にはデータが記録されていない場合は文字列にスペースが含まれていますが、3番目の変数では文字列がちょうど切り捨てられます。 – Fred12

+0

しかし、どうやって知っていますか?第1行目と第2行目は '' ''のように見えますが、スペースの数が変わったと言いますが、異なる結果が得られることをどのように知っていますか? 2番目の行が最初の行のように "切り落とされ"ていないことをどのように知っていますか?ロジックを説明することができれば、それをコード化することができます。 – Gregor

答えて

3

1)read.fwf Try read.fwf必要に応じて幅を調整します。

s <- c("abc   20", "csd 10", "eds  10  30") # test data 
read.fwf(textConnection(s), widths = c(3, 7, 7)) 

与える:

V1 V2 V3 
1 abc NA 20 
2 csd 10 NA 
3 eds 10 30 

2)関数kmeansこのアプローチは、開始列を見つけ、g、フィールド2及び3とクラスタそれらを2つのグループにkmeansを使用。それはフィールド1が常に存在していると仮定している。次に、行に2つのフィールドがある場合、それはそれが最も近いグループの中心に第2のフィールドを割り当てます。

与える
km <- kmeans(unlist(gregexpr(" \\S", s)), 2) 
centers <- sort(km$centers) 
g <- gregexpr(" \\S", s) 
spl <- strsplit(s, " +") 
f <- function(s, g) { 
    if (length(s) == 2) paste0(s[1], strrep(",", which.min(abs(g - centers))), s[2]) 
    else paste(s, collapse = ",") 
} 
read.table(text = mapply(f, spl, g), sep = ",", fill = TRUE, as.is = TRUE) 

V1 V2 V3 
1 abc NA 20 
2 csd 10 NA 
3 eds 10 30 
+0

ほぼそこにありますが、最初の行では、V2はNAでV3になります。手動では行が多すぎます。 – Fred12

+1

ありがとう!残念ながら、これは固定数の文字で分割されています。手動で幅を調整するには、他の行が少し違っていて多すぎます... – Fred12

+0

おそらく私は何か間違っていますが、私は同じものを取得しません...基本的に私は取得します: "abc X20 X50 "" csd 10 60 NA "" eds 10 30 40 " – Fred12

関連する問題