按名称读入一组csv列

问题描述

我有几十个不同长度的CSV文件。一些csv文件具有18列,而另一些具有9列。它们共享相同的列名称。我想按变量名读入每个文件的某些列。

这是我正在处理的一个小例子。

df1 <- tibble(a = 1:2,b = letters[1:2],c = NA,e=7:8)
df2 <- tibble(a = 8:9,b = letters[7:8],e = 8:9,c = NA)
df3 <- tibble(a = 8:9,d=5:6,e=7:8) 

我想插入a,b和e列。我无法指定列位置,因为它们在每个数据集中的位置都不同。我需要在每个文件中使用变量名来读取这些列。

这是我开始只读取所需列的功能。我不能真正使用它,因为每个csv文件的列位置差异很大,以至于它拉错了列。

read_fun = function(path){
  test = read.csv(path,sep=",",header=F,fill = TRUE,colClasses = c(rep("NULL",2),"character",rep("NULL",rep("character",14),5)),skip = 1,nrows = 17)
  test$question = path
  test
}

我知道col.names允许您在阅读时对列进行重命名,这对我没有帮助。

R是否可以通过每个文件的变量名来读取文件?

类似的东西:

test = read.csv("fileA.csv",sep = ",col_names = c("a","b","e"))

请帮忙!

解决方法

如果每个文件不是很大,并且不需要花时间阅读,则先读后选策略将起作用。如果自动类型检测无法正常工作,则可能需要在链的末尾添加mutate来调整列类型。

library(tidyverse)

read_fun <- function(path) {
  read_csv(path) %>%
    select(a,b,e)
}

如果要将所有data.frame合并为一个,请使用map_dfr

df_combined <-
  c("file1.csv","file2.csv","file3.csv") %>%
  map_dfr(funcion(path) {
    read_csv(path) %>%
      select(a,e) %>%
      mutate(a = as.numeric(a),b = as.character(b),e = as.numeric(e))
  })

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...