我有一个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导入。
答案 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
如果您想知道数据框中的所有列是否为数字,您可以使用all
和sapply
:
> 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中的项目。