views:

482

answers:

5

I have the following vector:

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

I would like to just retain the second number in each of the atoms of this vector so it would read: c(2, 1,2,1,2,1,2,1,2,1).

+4  A: 

There's probably a better way, but here are two approaches with strsplit():

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

The as.numeric() may not be necessary if you can use characters...

Shane
This is an elegant solution. Just what I was looking for. Thanks!
Zak
+2  A: 
substr(x = tmp3, start = 6, stop = 6)

So long as your strings are always the same length, this should do the trick.

(And, of course, you don't have to specify the argument names - substr(tmp3, 6, 6) works fine, too)

Matt Parker
+3  A: 

One could use read.table on textConnection:

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

then

> 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

so X$V2 is what you need.

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

if you need a numeric vector

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

What I think is the most elegant way to do this

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

If you need it to be an integer

storage.mode(res) <- "integer"
ephpostfacto