【问题标题】:Importing unquoted strings as factors using read_csv from the readr package in R使用 R 中 readr 包中的 read_csv 将未引用的字符串作为因子导入
【发布时间】:2017-03-15 00:15:39
【问题描述】:

我有一个包含许多列的 .csv 数据文件。不幸的是,字符串值没有引号(即,apples i.o. "apples)。当我使用 readr 包中的 read_csv 时,字符串值被导入为字符:

library(readr)

mydat = data.frame(first = letters, numbers = 1:26, second = sample(letters, 26))
write.csv(mydat, "mydat.csv", quote = FALSE, row.names = FALSE)

read_csv("mydat.csv")

结果:

Parsed with column specification:
cols(
  first = col_character(),
  numbers = col_integer(),
  second = col_character()
)
# A tibble: 26 x 3
   first numbers second
   <chr>   <int>  <chr>
1      a       1      r
2      b       2      n
3      c       3      m
4      d       4      z
5      e       5      p
6      f       6      j
7      g       7      u
8      h       8      l
9      i       9      e
    10     j      10      h
    # ... with 16 more rows

有没有办法强制 read_csv 将字符串值导入为因子 i.o.字符?

重要的是,我的数据文件有这么多列(字符串和数字变量),AFAIK 无法通过提供带有 col_types 参数的列规范来完成这项工作。

其他解决方案(例如,使用 read.csv 导入数据,或使用 dplyr 代码将数据框中的所有字符变量更改为因子)也值得赞赏。

更新:我了解到 csv 文件中的值是否带引号对 read.csv 或 read_csv 没有影响。 read.csv 会将这些值作为因子导入; read_csv 会将它们作为字符导入。我更喜欢使用 read_csv,因为它比 read.csv 快得多。

【问题讨论】:

  • col_types 中指定col_factor()。或者只使用read.csv
  • 例如read_csv('mydat.csv', col_types = cols(first = col_factor(levels = letters)))。不过,我认为您的问题可能会被误导; R 自动处理引号。
  • 不确定我是否明白你的意思;我的 csv 文件中的字符串值缺少引号。
  • col_types 不适用于我的数据;我有太多列(其中一些包含数值,其他包含字符串值),无法为每个列指定列类型。
  • 如果是空格分隔的文件引号可能很重要,但它们对于 CSV 没有任何意义,所以我不确定你的意思。 col_types 可用于cols 中的单个列名称;对于您未指定的人,它将默认为 col_guess()

标签: r string import readr


【解决方案1】:

此函数使用 dplyr 将 tbl_df 或数据框中的所有字符列转换为因子:

char.to.factors <- function(df){
  # This function takes a tbl_df and returns same with any character column converted to a factor

  require(dplyr)

  char.cols = names(df)[sapply(df, function(x) {class(x) == "character" })]
  tmp = mutate_each_(df, funs(as.factor), char.cols)
  return(tmp)
}

【讨论】:

  • 或者只是df %&gt;% mutate_if(is.character, factor)
  • 看起来这是 dplyr 0.5.0 中的新增功能,很好地简化了这一点。
  • mutate_if 效果很好!虽然数据框很大时速度很慢。
【解决方案2】:

我喜欢上面 cmets 中 alistaire 的 mutate_if() 解决方案,但为了完整起见,还有另一个解决方案应该提到。您可以使用 unclass() 强制重新解析。你会在很多使用 readr 的代码中看到这一点。

df <- data.frame(unclass(fr))

df <- df %>% unclass %>% data.frame

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 2021-12-27
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    相关资源
    最近更新 更多