我有一个包含许多列的.csv数据文件。不幸的是,字符串值没有引号(即苹果i.o。"苹果)。当我使用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快得多。
答案 0 :(得分:2)
我喜欢上面评论中的alistaire的mutate_if()解决方案,但为了完整起见,还有另一个应该提到的解决方案。你可以使用unclass()来强制重新解析。你会在许多使用readr的代码中看到这一点。
df <- data.frame(unclass(fr))
或
df <- df %>% unclass %>% data.frame
答案 1 :(得分: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)
}