【问题标题】:How to avoid factors in R when reading csv data读取csv数据时如何避免R中的因素
【发布时间】:2019-05-10 09:56:30
【问题描述】:

我在 csv 文件中有数据。当我读到它时,这些列处于因子级别,我无法使用它进行任何计算。

我用过 as.numeric(df$variablename) 但它为变量呈现了一组完全不同的数据。

original data in the variable: 2961,488,632,
   as.numeric output: 1,8,16

【问题讨论】:

  • 我认为您在这里遗漏了一些步骤。你能告诉我们你是如何在 csv 文件中阅读的吗?你在使用 read.csv 吗?这些数字肯定没有引用吗?数据中的某些地方可能有字符吗?
  • 这个问题不是read.table reads numbers as factors的重复问题。问题不在于数字太多。相反,一些数字被引用,或者(更有可能)列中有非数字值导致 R 将整个列强制转换为字符串。我建议重新打开,或者至少找到更合适的副本。
  • @gersht 可能是正确的 -- 数据可能有一些不是 NA 的符号表示丢失,或者如果它们是手动输入的,则某些记录是作为字符串输入的。
  • 呃,我写了一个很长的答案,无法发布。短版,读入,使用skimr::skim检查数据,交互处理。
  • 由于这是数据类型的问题,因此以实际类型(例如来自dput)的数据样本非常重要。没有它,就很难知道问题是由什么欺骗的——只是一个错误编码数据的猜谜游戏。

标签: r csv dataframe


【解决方案1】:

使用read.table读取数据时可以

  • 指定数据的分隔方式sep =
  • 小数点是多少dec = ,
  • NA 字符看起来像na.strings =
  • 您不想将字符串转换为因子stringsAsFactors = F

在你的情况下,你可以使用类似的东西:

read.table("mycsv.csv", header = TRUE, sep = ",", dec = ".", stringsAsFactors = F,
            na.strings = c("", "-"))

【讨论】:

  • R 将 strings 导入为因子,因此问题不在于列被导入为因子,而在于数字被解释为字符串,可能是因为异常缺失值。在那种情况下,像read.csv("file.csv", na.strings = c("nan", "-")) 这样的东西会更合适。
  • 如果没有来自 OP 的更多细节,很难确定,但我认为小数不太可能是罪魁祸首。 CSV 只有几种风格,显然 R 已经正确识别了分隔符。如果小数导致问题,那么它一定是异国情调,而不是,.。此外,示例值是整数。
  • 我删除了反对票,因为您添加了na.strings,并且 OP 的问题缺少重要细节,因此很难给出准确的答案。
  • @Cettt 我要补充一点,在他无法轻松进行目视扫描的大型数据集中,OP 应该读入数据,然后可能运行 table() 来查找不合格案例。跨度>
  • @Elin 现在这个问题已经结束了。在 OP 进一步输入之前,我会保留我现在的答案
【解决方案2】:

除了 Cettt 的回答,还有colClasses

如果您事先知道 csv 文件的列具有哪些数据类型,则可以指定这一点。这会阻止 R “猜测”数据类型是什么,并让您知道什么时候不正确,而不是决定它必须是字符串。例如如果您的 4 列 csv 文件包含 Text、Factors、Integer、Numeric 列,您可以使用

read.table("mycsv.csv", header = T, sep = ",", dec = ".", 
    colClasses=c("character", "factor", "integer", "numeric"))

编辑添加:

正如 gersht 所指出的,问题可能是数字列中的一些非数字。通常,这可能是值 NA 的编码方式。指定 colClasses 会导致 R 在遇到任何此类“非数字或 NA”值时给出错误消息,因此您可以轻松查看问题。如果它是 NA 的非默认编码,请使用参数 na.strings = c("NA", "YOUR NA VALUE") 如果这是另一个问题,您可能需要在导入之前修复文件。例如:

read.table(sep=",", 
           colClasses=c("character", "numeric"), 
           text="
           cat,11
           canary,12
           dog,1O")  # NB not a 10; it's a 1 and a capital-oh.

给予

扫描错误(文件 = 文件,什么 = 什么,sep = sep,quote = quote,dec = dec,: scan() 期望 'a real',得到 '1O'

【讨论】:

  • R 将 strings 导入为因子,因此问题不在于将列作为因子导入,而是将数字解释为字符串,可能是因为异常缺失值。在这种情况下,read.csv("file.csv", na.strings = c("nan", "-")) 之类的内容会更合适。
  • 无论read.table 认为数字是字符串,都会通过指定 colClasses 标记错误消息。这样我们就不必猜测 OP 文件中的内容了; R 将有助于告诉 OP 它发现什么不是数字。
猜你喜欢
  • 2018-09-27
  • 2021-03-19
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2022-06-14
  • 2021-12-27
  • 2017-04-11
相关资源
最近更新 更多