【问题标题】:R character factor to numeric vectorR字符因子到数值向量
【发布时间】:2011-06-15 06:23:50
【问题描述】:

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

EDIT Answer 需要适用于更一般的形式,例如,该列可能包含 3:6,7,9:11,需要将其转换为等效的 c(3:6,7,9:11 )。

【问题讨论】:

    标签: r csv types


    【解决方案1】:

    你可以这样做:

    > 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
    

    【讨论】:

    • 如果你想扩展它来处理这样的字符串:"3:6,7,9:11"(如问题的编辑形式)你可以把它变成一个函数str2c <- function(s) eval(parse(text=paste("c(", s, ")")))
    【解决方案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() 可能有意义的时候之一;-)

    【讨论】:

    • 处理具体问题,但不处理更一般的问题,例如该列也可能包含 3:6,7,9:11,需要转换为等价于 c (3:6,7,9:11)。
    • 很抱歉没有通灵 ;-)
    • @Benjamin 在这种情况下,parse() 可能是最简单的方法,遵循@Michael Dunn 对@Prasad 的回答的评论。我对parse() 的普遍厌恶导致在我更新的答案中摆在你面前的怪物。顺便说一句,Q 很好(+1)。
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多