如何联接具有不同长度的多个表并添加唯一的ID

时间:2019-02-15 23:46:46

标签: r

我有一个包含多个站点的气象数据的.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

1 个答案:

答案 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::rbindlistdplyr::bind_rows可以很容易地做到这一点。