【问题标题】:Convert a vector of string to a vector of integer将字符串向量转换为整数向量
【发布时间】:2013-12-22 17:38:40
【问题描述】:

以下按预期工作:

> as.integer(c("2","3"))
[1] 2 3

但是当我尝试(使用 stringr 包)时:

> str_split("55,66,77",",")
[[1]]
[1] "55" "66" "77"
> as.integer(str_split("55,66,77",","))
Error: (list) object cannot be coerced to type 'integer'

有没有其他方法可以将“55,66,77”形式的字符串转换为具有这三个数字的向量? 我是一个完整的新手,任何有关此文档的提示将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    str_split 返回一个列表。您必须访问正确的列表元素:

    as.integer(str_split("55,66,77",",")[[1]]) ## note the [[1]]
    # [1] 55 66 77
    

    或者您可以使用unlist 将完整列表转换为向量:

    as.integer(unlist(strsplit("55,66,77",",")))
    # [1] 55 66 77
    

    【讨论】:

    • 非常感谢,这真的很快。我认为列表是向量。
    • 列表是(通用)向量,但不是可以强制转换为整数的向量。
    【解决方案2】:

    如果您有一个字符串向量并且想要每个字符串的值,lapply 将遍历该列表:

    v <- c("55,66,77", "1,2,3")
    lapply(str_split(v, ','), as.integer)
    ## [[1]]
    ## [1] 55 66 77
    ## 
    ## [[2]]
    ## [1] 1 2 3
    

    【讨论】:

      【解决方案3】:
      as.integer(unlist(strsplit("55,66,77",",")))
      

      【讨论】:

        【解决方案4】:

        为什么不使用scan?如果所有数据都是以逗号分隔的整数开头,则结果将是一个整数向量,无需稍后使用as.integer。

        x <- "55,66,77"
        y <- scan(text = x, what = 0L, sep=",")
        # Read 3 items
        y
        #  [1] 55 66 77
        str(y)
        #  int [1:3] 55 66 77
        

        对于多个值,您可以选择需要单个向量还是向量列表:

        v <- c("55,66,77", "1,2,3")
        scan(text = v, what = 0L, sep=",")
        # Read 6 items
        # [1] 55 66 77  1  2  3
        lapply(seq_along(v), function(z) scan(text = v[z], what = 0L, sep = ","))
        # Read 3 items
        # Read 3 items
        # [[1]]
        # [1] 55 66 77
        # 
        # [[2]]
        # [1] 1 2 3
        

        如果您不希望收到有关读取了多少值的消息,请将 quiet = TRUE 添加到 scan....

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          • 2011-10-31
          • 1970-01-01
          • 1970-01-01
          • 2020-02-27
          • 1970-01-01
          • 2023-04-01
          相关资源
          最近更新 更多