data.frame中的数字列使用str()返回“num”但不是is.numeric()

时间:2010-01-22 16:25:36

标签: r

我有一个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导入。

3 个答案:

答案 0 :(得分:4)

> 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 

答案 1 :(得分:2)

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

编辑:

鉴于d1 [5]本身就是一个数据框,你需要对它进行处理。这样的事情应该有效:

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

答案 2 :(得分:2)

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

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

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

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