在R中拆分一个string向量

我有以下vector:

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

我想只保留在这个vector的每个primefaces中的第二个数字,所以它会读取:

 c(2,1,2,1,2,1,2,1,2,1) 

可能有更好的方法,但是这里有两个方法strsplit()

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

如果可以使用字符,则as.numeric()可能不是必需的。

可以使用textConnection read.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是你需要的。

我认为是最优雅的方式来做到这一点

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

如果你需要它是一个整数

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

这取决于您的实际数据与您提供的示例数据的相近程度。 我只是想在空间之后得到一切,你可以使用gsub

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

如果你想要实现一个比“把所有东西都放在后面”更复杂的规则,你需要一个更复杂的正则expression式。

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

只要你的string总是相同的长度,这应该做的伎俩。

(当然,你不必指定参数名称 – substr(tmp3, 6, 6)可以正常工作)

这应该做到这一点:

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

如果您需要数字向量,请使用

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

另一个选项是scan() 。 要获得第二个值,我们可以使用一个逻辑子集。

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

通过data.table将1列分成2列的更简单的方法

 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 ]