我有一个包含多个站点的气象数据的.txt文件夹(“ qc11025010.txt”“ qc11035010.txt”“ qc11035020.txt”“ qc11045010.txt” ....)。每个文件都有6列:年,月,日,降水,最高温度和最低温度以及不同的行长
files[1]
V1 V2 V3 V4 V5 V6
1 1983 3 5 92.0 -99.9 -99.9
2 1983 3 6 141.0 -99.9 23.0
3 1983 3 7 61.3 -99.9 18.6
4 1983 3 8 10.7 -99.9 -99.9
5 1983 3 9 0.0 -99.9 -99.9
6 1983 3 10 0.0 -99.9 -99.9
files[2]
V1 V2 V3 V4 V5 V6
1 1983 3 15 0.6 -99.9 -99.9
2 1983 3 16 29.4 33.8 24.8
3 1983 3 17 23.2 28.0 -99.9
4 1983 3 18 0.6 -99.9 23.0
5 1983 3 19 0.5 33.8 23.4
6 1983 3 20 0.0 33.2 22.2
库(dplyr)
files <- list.files(path = folder, pattern = "txt")
dat <- read.table(files[1])
dat$ID <- rep(as.character(files[1]))
for (x in files[2:278]){
tb <- lapply(x, read.table, header=F)
tb$ID <- rep(as.character(x))
res <- rbind(datos, tb)
colnames(res) <- c("YEAR","MONTH","DAY","PCP","TMAX","TMIN", "ID")
}
然后,我得到 rbind(deparse.level,...)中的错误: 无效的列表参数:所有变量的长度都应相同
我想加入表格并添加以下形式的唯一ID
YEAR MONTH DAY PCP TMAX TMIN ID
1983 3 5 92.0 -99.9 -99.9 qc11025010.txt
1983 3 6 141.0 -99.9 23.0 qc11025010.txt
1983 3 7 61.3 -99.9 18.6 qc11025010.txt
.....
1983 3 15 0.6 -99.9 -99.9 qc11045010.txt
1983 3 16 29.4 33.8 24.8 qc11045010.txt
1983 3 17 23.2 28.0 -99.9 qc11045010.txt
答案 0 :(得分:0)
使用list
和/或lapply
,然后是摘要Map
,可以轻松地将多个文件加载到单个rbind
中,然后按行将它们串联起来。
设置:我将在当前目录中创建三个文件:
ign <- sapply(1:3, function(i) write.csv(mtcars[1:3, 1:4], file=paste0(i, ".csv"),
row.names=FALSE))
lof <- list.files(path=".", pattern="*.csv", full.names=TRUE)
lof
# [1] "./1.csv" "./2.csv" "./3.csv"
现在使用该数据,我们首先加载数据:
dat <- lapply(lof, read.csv)
dat[1]
# [[1]]
# mpg cyl disp hp
# 1 21.0 6 160 110
# 2 21.0 6 160 110
# 3 22.8 4 108 93
,然后将文件名与Map
一样以类似“拉链”的方式分别绑定到每个文件名:
Map(cbind, dat, filename = basename(lof))
# [[1]]
# mpg cyl disp hp filename
# 1 21.0 6 160 110 1.csv
# 2 21.0 6 160 110 1.csv
# 3 22.8 4 108 93 1.csv
# [[2]]
# mpg cyl disp hp filename
# 1 21.0 6 160 110 2.csv
# 2 21.0 6 160 110 2.csv
# 3 22.8 4 108 93 2.csv
# [[3]]
# mpg cyl disp hp filename
# 1 21.0 6 160 110 3.csv
# 2 21.0 6 160 110 3.csv
# 3 22.8 4 108 93 3.csv
我们可以使用这一新列,并将它们行绑定到一个步骤中,
do.call("rbind.data.frame", c(Map(cbind, dat, filename = basename(lof)), stringsAsFactors = FALSE))
# mpg cyl disp hp filename
# 1 21.0 6 160 110 1.csv
# 2 21.0 6 160 110 1.csv
# 3 22.8 4 108 93 1.csv
# 4 21.0 6 160 110 2.csv
# 5 21.0 6 160 110 2.csv
# 6 22.8 4 108 93 2.csv
# 7 21.0 6 160 110 3.csv
# 8 21.0 6 160 110 3.csv
# 9 22.8 4 108 93 3.csv
使用stringsAsFactors=FALSE
,这样我们就不必处理(不兼容的)factor
。使用data.table::rbindlist
或dplyr::bind_rows
可以很容易地做到这一点。