【问题标题】:How to coerce a list object to type 'double'如何强制列表对象键入'double'
【发布时间】:2012-09-12 08:29:59
【问题描述】:

代码:

a <- structure(list(`X$Days` = c("10", "38", "66", "101", "129", "185", "283", 
                                 "374")), .Names = "X$Days")

那么a就像

$`X$Days`
[1] "10"  "38"  "66"  "101" "129" "185" "283" "374"

我想将 a 强制转换为数值数组,但强制函数返回我

Error: (list) object cannot be coerced to type 'double'

谢谢,

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您想将a 的所有元素转换为单个数字向量 并且length(a) 大于1(好的,即使它的长度为1),您可以@987654324先@对象再转换。

    as.numeric(unlist(a))
    # [1]  10  38  66 101 129 185 283 374
    

    请注意,这里没有任何质量控制。另外,X$Days 是一个非常奇怪的名字。

    【讨论】:

    • 运行此命令后的数字(因子)变为不同的数字
    • @PM0087 如果“数字”被存储为因子,就会发生这种情况。在这种情况下使用as.numeric 将使用因子标签所索引到的基础整数值
    • 谢谢本。我已经尝试了两种最流行的方法。 as.numeric(as.character(f)) 将所有内容转换为 NAas.numeric(levels(f))[f] 返回错误 invalid subscript type 'list'.
    • @PM0087 您可能必须在转换为数字之前使用unlist,或者在此处的其他答案之一中使用lapply 方法,在链接的问答中应用一种因子转换方法
    【解决方案2】:

    如果您的列表作为多个元素需要转换为数字,您可以通过lapply(a, as.numeric) 来实现。

    【讨论】:

    • 运行此命令后的数字(因子)变为不同的数字
    【解决方案3】:

    您还可以使用列表子集来选择要转换的元素。如果您的列表包含 1 个以上的元素,这将很有用。

    as.numeric(a[[1]])

    【讨论】:

      【解决方案4】:

      在这种情况下,循环也可以完成这项工作(并且通常足够快)。

      a <- array(0, dim=dim(X))
      for (i in 1:ncol(X)) {a[,i] <- X[,i]}
      

      【讨论】:

        【解决方案5】:

        部分数据存在问题。考虑:

        as.double(as.character("2.e")) # This results in 2
        

        另一种解决方案:

        get_numbers <- function(X) {
            X[toupper(X) != tolower(X)] <- NA
            return(as.double(as.character(X)))
        }
        

        【讨论】:

          猜你喜欢
          • 2012-01-17
          • 1970-01-01
          • 2016-05-22
          • 1970-01-01
          • 2017-11-01
          • 2016-09-30
          • 1970-01-01
          • 1970-01-01
          • 2020-08-17
          相关资源
          最近更新 更多