2009-11-04 54 views
35

串矢量I具有以下矢量:拆分中的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) 
+0

你能接受答案来标记问题已解决吗? – MERose 2015-12-29 01:33:34

回答

31

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

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

的as.numer IC()可能不是必要的,如果你能使用的字符...

+0

这是一个优雅的解决方案。正是我在找的东西。谢谢! – Zak 2009-11-05 14:07:21

+0

我试图使用你的解决方案,而是使用数据框的列,并且它不能马上工作。我会补充说,对于这些情况,你需要把它变成一个列表。 'as.numeric(data.frame(strsplit(如。list(df $ columnx),“”))[2,])' – pedrosaurio 2013-05-02 18:57:48

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

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

(当然,你不必指定参数名 - substr(tmp3, 6, 6)做工精细,太)

21

人们可以使用read.tabletextConnection

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是你所需要的。

4

这应做到:

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

如果你需要一个数字载体,应用

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

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

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

如果你需要它是一个整数

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

另外,'res < - as.numeric(sapply(...))'也适用; 'storage.mode'有点可怕 – user295691 2013-04-30 20:02:55

-1

更简单的方法来通过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 ] 
8

1列分成两列这取决于你的实际数据是如何密切你给出的示例数据匹配一点点。我你只是试图让空间之后的一切,你可以使用gsub

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

如果你想实现一个规则比“乘坐空间后,一切”更复杂,你需要一个更复杂的正规表达。

+0

你能解释一下吗...... – user3067923 2016-11-17 19:56:59

+0

'gsub'函数是用来替换正则表达式匹配的东西。在这种情况下,我们使用正则表达式'。+ \\ s +'并用空字符串''“'替换我们找到的任何匹配项。正则表达式转换为“在一开始就匹配任何东西,但它必须以一个空格结束”(字符空间写为\\ s') – 2017-09-18 18:11:13

1

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

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