按名称读入一组csv列

时间:2020-09-10 18:48:14

标签: r tidyverse read.table read.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, b = letters[7:8], c = NA, 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",2),
                                                                                   rep("character",14), rep("NULL",5)),
                  skip = 1, nrows = 17)
  test$question = path
  test
}

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

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

类似的东西:

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

请帮忙!

1 个答案:

答案 0 :(得分:0)

如果每个文件不是很大,并且不需要花时间阅读,则先读后选策略将起作用。如果自动类型检测无法正常工作,则可能需要在链的末尾添加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, b, e) %>%
      mutate(a = as.numeric(a),
             b = as.character(b),
             e = as.numeric(e))
  })