setwd("d:/wu/input")
# 读入文件目录
(fl <- list.files())
dt <- list()
# 用data.table的fread()最容易
# 结果保存在list中
for (i in 1:length(fl)) {
dt[[i]] <- fread(fl[[i]],colClasses="character")
}
# 提取所有列名,去重
(nm <- lapply(dt, names) %>% unique())
# 定义函数,将包含相同列的表放到一个文件中
# 注意,此处汇总数据用的结构是data.table(),不是list()
my_input_a <- function(dt,nm){
dm <- data.table()
for (i in 1:length(dt)) {
if(setequal(names(dt[[i]]),nm)){
dm <- rbind(dm,dt[[i]][,.SD,.SDcols=nm])
}
}
return(unique(dm))
}
# 用循环调用刚才定义的函数,所用的数据结构变回list
ds <- list()
for (i in 1:length(nm)) {
ds[[i]] <- my_input_a(dt,nm[[i]])
}
上面的代码有点多,可以精简一下
getwd()
setwd("d:/myR")
library(tidyverse)
library(data.table)
(fl <- list.files())
# 定义一个列表的列表,每个列表存放一个原始文件
dt <- list()
for (i in 1:length(fl)) {
dt[[i]] <- list()
}
# 将原始数据读入列表
for (i in 1:length(fl)) {
dt[[i]] <- fread(fl[[i]],colClasses = "character")
}
# 提取所有列名,去重
(lapply(dt, names) %>% unique()->nm)
# 定义函数,比对列名,将格式相同的放到一个列表中
my_fun <- function(i,j){
if(setequal(names(dt[[i]]),nm[[j]])){
ds[[j]] <<- rbind(ds[[j]],dt[[i]])
}
}
# 定义一个列表的列表,将格式相同的放到一个列表中
ds <- list()
for (i in 1:4) {
ds[[i]] <- list()
}
# 通过两重循环完成匹配汇总
for (i in 1:length(fl)) {
for (j in 1:4) {
my_fun(i,j)
}
}