使用R中的readr包中的read_csv将未引用的字符串作为因素导入

use*_*777 5 string import r readr

我有一个包含许多列的.csv数据文件。不幸的是,字符串值没有引号(即apples io“ 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")
Run Code Online (Sandbox Code Playgroud)

结果是:

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
Run Code Online (Sandbox Code Playgroud)

有没有办法强制read_csv导入字符串值作为io字符的因子?

重要的是,我的数据文件具有如此多的列(字符串和数字变量),因此AFAIK无法通过使用col_types参数提供列规范来实现这一目的。

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

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

小智 2

此函数使用 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)
}
Run Code Online (Sandbox Code Playgroud)

  • 或者只是 `df %&gt;% mutate_if(is.character, Factor)` (10认同)