【问题标题】:Numeric Column in data.frame returning "num" with str() but not is.numeric()data.frame 中的数字列使用 str() 而不是 is.numeric() 返回“num”
【发布时间】:2010-01-22 16:25:35
【问题描述】:

我有一个 data.frame,d1,它有 7 列,第 5 到第 7 列应该是数字:

str(d1[5])
'data.frame':   871 obs. of  1 variable:
 $ Latest.Assets..Mns.: num  14008 1483 11524 1081 2742 ... 

is.numeric(d1[5])
[1] FALSE

as.numeric(d1[5])
Error: (list) object cannot be coerced to type 'double'

这怎么可能?如果 str 将其标识为数字,它怎么可能不是数字?我正在从 CSV 导入。

【问题讨论】:

    标签: r


    【解决方案1】:
    > is.numeric_data.frame=function(x)all(sapply(x,is.numeric))
    
    > is.numeric_data.frame(d1[[5]])
    [1] TRUE 
    

    为什么

    d1 是一个列表,因此d1[5] 是一个长度为 1 的列表,在这种情况下包含一个 data.frame。要获取数据框,请使用d1[[5]]

    即使数据框包含数字数据,它本身也不是数字:

    > x = data.frame(1:5,6:10)
    > is.numeric(x)
    [1] FALSE
    

    数据框中的各个列要么是数字,要么不是数字。例如:

    > z <- data.frame(1:5,letters[1:5])
    
    > is.numeric(z[[1]])
    [1] TRUE
    > is.numeric(z[[2]])
    [1] FALSE
    

    如果您想知道数据框中的所有列是否都是数字,可以使用allsapply

    > sapply(z,is.numeric)
        X1.5 letters.1.5. 
        TRUE        FALSE 
    
    > all(sapply(z,is.numeric))
    [1] FALSE
    
    > all(sapply(x,is.numeric))
    [1] TRUE
    

    你可以用一个方便的函数把这一切包装起来:

    > is.numeric_data.frame=function(x)all(sapply(x,is.numeric))
    
    > is.numeric_data.frame(d1[[5]])
    [1] TRUE 
    

    【讨论】:

      【解决方案2】:

      d1[5] 不是单个值。它是一个值的向量(可能是一个列表?)。如果你抓住一个值,我敢打赌它是数字的。例如:

      is.numeric(d1[5][[1]])
      as.numeric(d1[5][[1]])
      

      所以我认为混淆是在列对象和列中的元素之间。 R 对这两种想法进行了区分,而其他语言(如 SQL)在功能上假设在讨论列时您通常指的是列的元素。

      来自 R 语言定义文档的 discussion of indexing 确实帮助我理解了如何在 R 中引用项目。

      【讨论】:

      • 列表成员是一个数据框,它永远不是数字。
      • 亚历克斯:你在说什么?类(列表(x=1)[[1]])==“数字”
      【解决方案3】:

      它可能是一个列表(基于错误消息)。你试过class(d1[5])吗?如果它是一个列表,那么您会期望 d1[[5]]d1[5][[1]] 是数字。

      编辑:

      鉴于 d1[5] 本身就是一个数据框,您需要这样对待它。像这样的东西应该可以工作:

      is.numeric(d1[5][,1])
      

      【讨论】:

      • class(d1[5]) 返回,[1] "data.frame"。额外的一组方括号对 d1[[5]] 有什么作用?
      • 如果 d1 实际上是一个列表,那么额外的一组括号会有所帮助。但基本上你需要从你的 data.frame 的 data.frame 中提取值...
      • 1beb,为了更好地理解 [] 和 [[]] 之间的区别,请查看 R Lang Def 的索引部分:cran.r-project.org/doc/manuals/R-lang.html#Indexing
      • d1 是一个列表。请参阅我的答案以提取价值。
      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2021-11-08
      • 2023-03-25
      • 2021-07-11
      相关资源
      最近更新 更多