Разделите вектор строки в 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)
Ответы
Ответ 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 ]