Подтвердить что ты не робот

Разделите вектор строки в R

У меня есть следующий вектор:

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

Я хотел бы просто сохранить второе число в каждом из атомов этого вектора, поэтому он будет читать:

c(2,1,2,1,2,1,2,1,2,1)
4b9b3361

Ответ 1

Вероятно, лучший способ, но вот два подхода с strsplit():

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

Возможно, что as.numeric() может не понадобиться, если вы можете использовать символы...

Ответ 2

Можно использовать read.table в textConnection:

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 - это то, что вам нужно.

Ответ 3

Я думаю, что это самый элегантный способ сделать это

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

Если вам нужно, чтобы это целое число

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

Ответ 4

Это немного зависит от того, насколько точно ваши фактические данные соответствуют приведенным вами данным примера. Я просто пытаюсь получить все после пробела, вы можете использовать gsub:

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

Если вы пытаетесь реализовать правило более сложное, чем "взять все после пробела", вам понадобится более сложное регулярное выражение.

Ответ 5

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

Пока ваши строки всегда одинаковой длины, это должно сделать трюк.

(И, конечно, вам не нужно указывать имена аргументов - substr(tmp3, 6, 6) тоже отлично работает)

Ответ 6

Это должно сделать это:

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

Если вам нужен числовой вектор, используйте

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

Ответ 7

Другой вариант - scan(). Чтобы получить второе значение, мы можем использовать логическое подмножество.

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

Ответ 8

Более простой способ разделить 1 столбец на 2 столбца с помощью 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 ]