R字符因子到数字向量

时间:2011-01-25 15:04:24

标签: r csv types

我在其中一个字段中读取了带有“3:29”的csv文件(不带引号)。这是一个因素。如何将其转换为数字向量,例如C(3:29)?我尝试了as.vector()但这给了一个字符串向量“3,4,5,6 ... 29”(带引号,仍然是字符类)。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

拆分:上的字符串并转换为数字矢量并手动生成对seq()的调用:

> 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

或稍微优雅一点,让R直接构建对`:()`的调用:

> 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()可能有意义的时候之一; - )