web-dev-qa-db-ja.com

空白で文字列ベクトルを分割する

次のベクターがあります。

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)
37
Zak

おそらくもっと良い方法がありますが、strsplit()を使用した2つのアプローチがあります。

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

文字を使用できる場合、as.numeric()は必要ないかもしれません...

36
Shane

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が必要なものです。

21
Marek

実際のデータが、指定したサンプルデータとどれだけ一致しているかによります。スペースの後にすべてを取得しようとしているのであれば、gsubを使用できます。

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

「スペースの後にすべてを取る」よりも複雑なルールを実装しようとする場合、より複雑な正規表現が必要になります。

11
SchaunW

これを行う最もエレガントな方法だと思います

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

整数にする必要がある場合

>     storage.mode(res) <- "integer"
9
ephpostfacto
_substr(x = tmp3, start = 6, stop = 6)
_

文字列が常に同じ長さである限り、これでうまくいくはずです。

(そして、もちろん、引数名を指定する必要はありません-substr(tmp3, 6, 6)もうまく機能します)

5
Matt Parker

これはそれを行う必要があります:

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

数値ベクトルが必要な場合は、使用します

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

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

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