Excel csv数据文件(称为ff)有54列& 0和0之间的788行标准化数据。 1,看起来像这样:0.39 0.16 0.27 0.60 ......
> str(ff)
'data.frame': 788 obs. of 54 variables:
$ V1 : Factor w/ 66 levels " - "," 0.05 ",..: 25 36 33 44 36 37 39 20
> dd <- as.numeric(as.character(ff))
Warning message:
NAs introduced by coercion
> dd <- gsub(".","",ff)
> de <- as.numeric(as.character(dd))
> str(de)
num [1:54] NA NA NA NA NA NA NA NA NA NA ...
我不知所措。我看到很多人(也许像我这样的初学者)发布了类似的问题,请接受我再次提出此事的道歉。我提前感谢你的建议。
答案 0 :(得分:0)
我认为您遇到的一个问题是您在整个数据框上运行as.numeric(as.character(.))
调用,而不是特定列。结果是一个向量,其长度等于数据框中的列数(请注意,您的输出是长度为54的向量,而不是像您一样希望来自原始数据框的列的788 )。这就是原因:
将数据框转换为字符时,会得到一个向量:
df <- data.frame( V1 = c(1,2,3), V2 = c(4,5,6) )
as.character( df )
[1] "c(1, 2, 3)" "c(4, 5, 6)"
请注意,每个向量元素不是字符向量(即:c("1","2","3")
),但实际上是表示该列的向量,转换为字符串(即:"c(1, 2, 3)"
)。因此,当您将as.numeric
应用于该向量时,您将获得向量(不是数据帧),并且因为每个元素都无法转换为数字(甚至是数字向量) ,你得到NA
的回复:
as.numeric( as.character( df ) )
[1] NA NA
您更有可能寻找的是单个列的转换,而不是整个数据框的转换。尝试:
ff$V1 <- as.numeric( as.character( ff$V1 ) )
这样您就可以将矢量转换为矢量,这样可以为您提供后续的结果。您可以使用lapply
在每列上执行此操作,例如:
df <- lapply( df, function(x) as.numeric( as.character( x ) ) )
df <- as.data.frame( df )
(或者更好的是,根据@ s.brunel的评论阅读文件时设置colClasses
,这样您就不必担心这种转换了<) / p>
另请注意@ akrun的评论。在转换向量时,您应该期望一个警告,其中某些值无法转换为您想要的类。在您的情况下,您已经获得了一些" - "
值,这些值无法转换为数字,因此您将获得NA
代替这些值。