使用fread和file_list时将列更改为字符

mctunoxg  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(126)

我需要读取多个csv文件和im使用文件列表和Fread在R,但不断得到以下错误,列26包含电话号码,如果这有助于我想改变它的字符
“rbindlist(l,use.names,fill,idcol)中的错误:内部错误:结果的第26列被确定为整数64,但是maxType==‘character’!= REALSXP”
这是我的代码

##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##
SD_data <- data.table(NULL)

file_list <- list.files(path = SD_Data_feed, pattern="ldn - Data.*\\.csv", ignore.case=TRUE)

for (i in 1:length(file_list)){
  temp_data <- fread(file.path(SD_Data_feed, file_list[i]),
                 
                     select = c(1:4,6:33),
               
                      encoding = "UTF-8")
                  
   SD_data <- unique(rbind(SD_data, temp_data))}

我尝试了很多方法:
colClasses=list(character=26)在select和encoding之间
colClasses=c(26 =“character”)在select和encoding之间

k5ifujac

k5ifujac1#

使用colClasses=list(character=26)
示例数据和演示:

write.csv(mtcars[1:3,], "mt.csv", row.names = FALSE)
fread("mt.csv")
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#    <num> <int> <int> <int> <num> <num> <num> <int> <int> <int> <int>
# 1:  21.0     6   160   110  3.90 2.620 16.46     0     1     4     4
# 2:  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4
# 3:  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1
fread("mt.csv", colClasses = list(character = 2))
#      mpg    cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#    <num> <char> <int> <int> <num> <num> <num> <int> <int> <int> <int>
# 1:  21.0      6   160   110  3.90 2.620 16.46     0     1     4     4
# 2:  21.0      6   160   110  3.90 2.875 17.02     0     1     4     4
# 3:  22.8      4   108    93  3.85 2.320 18.61     1     1     4     1

为了自动化你的代码,我推荐几件事:

  • list.files(..., full.names = TRUE)排除了将目录(我们已经知道)与文件名粘贴在一起的需要
  • lapply到帧列表中;
  • rbindlist合并为一帧
file_list <- list.files(path = SD_Data_feed, pattern = "ldn - Data.*\\.csv",
                        full.names = TRUE, ignore.case = TRUE)
SD_data <- lapply(file_list, fread, colClasses = list(character = 26),
                  select = c(1:4, 6:33), encoding = "UTF-8") |>
  rbindlist()

(The |>是R-4或更新版本。)

相关问题