在R中读取具有不同标头的多个.txt文件,并将文件名保存为每个文件的列

时间:2017-07-19 20:38:23

标签: r read.csv

我有超过100个需要导入R的文本文件。其中有一些文件有不同的标题。我知道在使用do.call将它们合并到一个数据框之前我可以为所有文件分配相同的标题。 。但在此之前,我需要将每个文件的文件名保存为新列。我该怎么做?我有太多文件要手动创建新列。谢谢

1 个答案:

答案 0 :(得分:0)

我编写了一个可重复的例子。 如果您想跳过可重复的示例,请跳至您想要的内容。要写入csv个文件的一些数据。 temp0有2列,temp1有3列

制作数据

library(tidyverse)

temp0 <- mtcars %>% head(.,5) %>% select(mpg,cyl)

                   mpg cyl
Mazda RX4         21.0   6
Mazda RX4 Wag     21.0   6
Datsun 710        22.8   4
Hornet 4 Drive    21.4   6
Hornet Sportabout 18.7   8

temp1 <- mtcars %>% head(.,5) %>% select(cyl,gear,carb)

                  cyl gear carb
Mazda RX4           6    4    4
Mazda RX4 Wag       6    4    4
Datsun 710          4    4    1
Hornet 4 Drive      6    3    1
Hornet Sportabout   8    3    2

要将它们写入文件,我会创建数据名称的随机向量

set.seed(1)
num.files <- 20
rand.num <- sample(c(0,1),num.files,replace=T)
files <- paste0(rep("temp",20),rand.num)

head(files)
[1] "temp0" "temp0" "temp1" "temp1" "temp0"

最后写入csv个文件

library(readr)
for (i in 1:length(files)) {
    write_csv(get(files[i]), paste0("C:/temp/temp", i, ".csv"), col_names=F)
}

-----你想要什么-----

要阅读文件并添加id,您可以使用map

temp <- map(1:20,~read_csv(paste0("C:/temp/temp", .x, ".csv"),col_names=F) %>% mutate(id=.x))

根据您的列名称,以下内容可能会帮助您使用Reducefull_join以一种整洁的方式加入它们(它适用于此玩具示例)。

final <- Reduce(full_join, temp)

<强>输出

head(final)
      X1    X2    id    X3
 1  21.0     6     1    NA
 2  21.0     6     1    NA
 3  22.8     4     1    NA
 4  21.4     6     1    NA
 5  18.7     8     1    NA