2009-11-04 13 views
35

の文字列ベクトルI以下のベクトルを有する:分割R

tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2", 
"1530 1", "1540 2", "1540 1") 

私はそれを読み取ることになるので、ちょうど、このベクターの原子の各々の2番目の数を維持したい:

c(2,1,2,1,2,1,2,1,2,1) 
+0

質問を解決済みとしてマークする回答を受け入れることはできますか? – MERose

答えて

31

は、おそらくより良い方法はありますが、ここでstrsplit()を持つ2つのアプローチです:

as.numeric(data.frame(strsplit(tmp3, " "))[2,]) 
as.numeric(lapply(strsplit(tmp3," "), function(x) x[2])) 

as.numerは、文字を使用できるのであれば、ic()は必要ないかもしれません...

+0

これは洗練されたソリューションです。ちょうど私が探していたもの。ありがとう! – Zak

+0

私はあなたのソリューションを使用しようとしましたが、代わりにデータフレームの列を使用しましたが、すぐには機能しませんでした。私はそれらをリストにする必要がある場合に追加します。 'as.numeric(data.frame(strsplit(as。 – pedrosaurio

5
substr(x = tmp3, start = 6, stop = 6) 

文字列が常に同じ長さであれば、このトリックを行う必要があります。

(そして、もちろん、あなたが引数名を指定する必要はありません - あまりにも、正常に動作しますsubstr(tmp3, 6, 6)

21

一つはtextConnectionread.tableを使用することもできます。その後、

X <- read.table(textConnection(tmp3)) 

> str(X) 
'data.frame': 10 obs. of 2 variables: 
$ V1: int 1500 1500 1510 1510 1520 1520 1530 1530 1540 1540 
$ V2: int 2 1 2 1 2 1 2 1 2 1 

だから、X$V2が必要です。

4

これそれを行う必要があります:あなたが数値ベクトルが必要な場合は、

library(plyr) 
ldply(strsplit(tmp3, split = " "))[[2]] 

私はこの

>  res <- sapply(strsplit(tmp3, " "), "[[", 2) 

の場合を行うための最もエレガントな方法だと思う何

as.numeric(ldply(strsplit(tmp3, split = " "))[[2]]) 
9

を使用あなたはそれを整数にする必要があります

>  storage.mode(res) <- "integer" 
+0

また、 'res < - as.numeric(sapply(...))'も同様に動作します。 'storage.mode'は少し怖いです – user295691

-1

2列に1列を分割する簡単な方法data.table

require(data.table) 
data_ex = data.table(a = paste(sample(1:3, size=10, replace=TRUE),"-separate", sep="")) 
data_ex[, number:= unlist(strsplit(x=a, split="-"))[[1]], by=a] 
data_ex[, word:= unlist(strsplit(x=a, split="-"))[[2]], by=a ] 
8

を経由してそれはあなたの実際のデータは、あなたが与えてくれた例のデータと一致するか密接に少し依存します。私あなたがちょうどあなたがgsubを使用することができ、スペースの後にすべてを取得しようとしている:

gsub(".+\\s+", "", tmp3) 
[1] "2" "1" "2" "1" "2" "1" "2" "1" "2" "1" 

あなたが「宇宙の後にすべてを取る」よりも複雑なルールを実装しようとしている場合は、あなたが必要となりますより複雑な規則的な表現。

+0

あなたはこれを説明できますか... – user3067923

+0

関数' gsub'は正規表現のマッチを他のものに置き換えるためのものです。この場合、正規表現 '。+ \\ s +'を使用して、見つかった一致を空の文字列 '" "'で置き換えます。正規表現は「最初は何でもマッチしますが、スペースで終わらなければなりません」(文字スペースは '\\ s'と書かれています) –

1

もう1つのオプションはscan()です。 2番目の値を取得するには、論理サブセットを使用できます。

scan(text = tmp3)[c(FALSE, TRUE)] 
# [1] 2 1 2 1 2 1 2 1 2 1