【问题标题】:Importing Excel csv file into RStudio & converting factors to numeric, I get either NAs or new data; tried eliminating commas but still get NAs将 Excel csv 文件导入 RStudio 并将因子转换为数字,我得到 NA 或新数据;尝试消除逗号但仍然得到 NA
【发布时间】:2017-05-26 01:22:29
【问题描述】:

Excel csv 数据文件(称为 ff)在 0 和 1 之间有 54 列和 788 行标准化数据,如下所示: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 ...

我很茫然。我看到很多人(可能是像我这样的初学者)发布了一些类似的问题,请接受我再次提出这个问题的歉意。我提前感谢您的建议。

【问题讨论】:

  • 你有像" - "这样的元素。警告消息是友好的,它将这些元素转换为 NA
  • 读取时将colClasses设置为数字
  • @user7403680 你还对此感兴趣吗?这里有什么对你有帮助吗,还是你还有这个问题?

标签: r excel csv rstudio


【解决方案1】:

我认为您遇到的一个问题是您正在对整个数据框而不是特定列运行 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,这样您就完全不用担心这种转换了)

还要注意@akrun 的评论。在转换某些值无法转换为所需类的向量时,您应该期待警告。在您的情况下,您有一些 " - " 值,它们无法转换为数字,因此您将获得 NAs 来代替这些值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2015-01-27
    • 2013-07-31
    相关资源
    最近更新 更多