2011-01-25 97 views
3

我在其中一个字段(不带引号)中使用“3:29”读取csv文件。这是一个因素。我怎样才能将其转换为数字向量C(3:29)?我试过as.vector(),但是这给了一个字符串向量“3,4,5,6 ... 29”(带引号,仍然是字符类)。R字符因子与数字向量

编辑答案需要适用于更一般的形式,例如,列可以包含3:6,7,9:11,需要将其转换为等效的c(3:6,7,9: 11)。

回答

10

你可以这样做:

> eval(parse(text='3:29')) 
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
[26] 28 29 
2

拆分上:串并转换为数字组成的矢量,并生成由手调用seq():通过让R键呼叫建立到`:()`直接

> vars <- as.numeric(strsplit("3:29", ":")[[1]]) 
> seq(from = vars[1], to = vars[2], by = 1) 
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
[26] 28 29 

或稍微更优雅:

> do.call(`:`, as.list(as.numeric(strsplit("3:29", ":")[[1]]))) 
[1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
[26] 28 29 

[光编辑更新到原始Q]

在精神:

> require(fortunes) 
> fortune(106) 

If the answer is parse() you should usually rethink the question. 
    -- Thomas Lumley 
     R-help (February 2005) 

这是接近我可以不使用parse()

unlist(lapply(strsplit(strsplit(txt, ",")[[1]], ":"), 
     function(x) { 
      x <- as.numeric(x) 
      if(length(x) == 2) { 
       seq(x[1], x[2], by = 1) ## `:`(x[1], x[2]) 
      } else { 
       x[1] 
      } 
     })) 

产生:

[1] 3 4 5 6 7 9 10 11 

...但它让我这可能是使用parse()可能有意义的那些时间之一;-)

+0

需要照顾的具体问题,而不是更普遍的问题,例如,该列还可以包含3:6,7,9:11,这需要转换相当于c(3:6,7,9:11)。 – Benjamin 2011-01-25 15:18:23

+7

不道歉,因为不是通灵;-) – 2011-01-25 15:30:41