r语言 - 将Excel csv文件导入RStudio并将因子转换为数字,我得到NA或新数据;尝试消除逗号,但仍然得到 NA



Excelcsv数据文件(称为ff)有54列&788行在0&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 ...

我不知所措。我看到很多人(也许像我这样的初学者)都发布了一些类似的问题,请接受我再次提出此事的歉意。我事先感谢你的建议。

我认为您遇到的一个问题是在整个数据帧上运行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 )

(或者更好的是,根据@sbrunel的评论,在读取文件时设置colClasses,这样你就根本不需要担心这个转换了)

另请注意@akrun的评论。在转换某些值无法转换为所需类的向量时,您应该期望出现警告。在您的情况下,您有一些" - "值,这些值无法转换为数字,因此您将使用NA来代替这些值。

最新更新