组合多文件,并为每个文件添加唯一的ID

时间:2018-11-23 14:15:58

标签: r csv dataframe

我是R的新手。合并数据时遇到问题,希望有人帮助解决。 假设我有两个CSV文件,例如A.csv和B.csv,位于路径“ C:\ Users \ Public \ A”。 它们看起来像这样:

A.csv

T,2015,2016,2017,2018 X1,1,2,3,2 X2,1,2,2,3 X3,1,3,4,2

B.csv

T,2015,2016,2017 X1,2,4,3 X2,2,2,3 X3,3,3,4

然后,我尝试将它们结合起来,并通过以下函数进行转置。它们由here的Ricardo Oliveros-Ramos和here的Tony Cookson创建。 1.首先,我创建函数read.tcsv来读取和转置CSV文件中的数据

  read.tcsv = function(file, header=TRUE, sep=",", ...) {
  n = max(count.fields(file, sep=sep), na.rm=TRUE)
  x = readLines(file)

  .splitvar = function(x, sep, n) {
    var = unlist(strsplit(x, split=sep))
    length(var) = n
    return(var)
  }

  x = do.call(cbind, lapply(x, .splitvar, sep=sep, n=n))
  x = apply(x, 1, paste, collapse=sep) 
  out = read.csv(text=x, sep=sep, header=header, ...)
  return(out)

}

2。然后,我使用multrbind.fill组合并填充缺失值

multrbind.fill = function(mypath){
  filenames=list.files(path=mypath, full.names=TRUE)
  datalist = lapply(filenames, function(x){
    read.tcsv(file=x,header=T)
  }
)
    Reduce(function(x,y) {plyr::rbind.fill(x,y)}, datalist)
}
  1. 结果看起来不错:

ï..T X1 X2 X3 2015 1 1 1 2016 2 2 3 2017 3 2 4 2018 2 3 2 2015 2 2 3 2016 4 2 3 2017 3 3 4

  1. 但是,我想为每个文件添加一个列作为其文件名(或唯一ID)的标识符,如下所示:

ï..T ID X1 X2 X3 2015 A 1 1 1 2016 A 2 2 3 2017 A 3 2 4 2018 A 2 3 2 2015 B 2 2 3 2016 B 4 2 3 2017 B 3 3 4

有人帮我!?提前致谢。

2 个答案:

答案 0 :(得分:1)

感谢 TJ83 帮助我纠正此功能。基于 TJ83 的注释,我添加了一个名为ID的标识符列。这是我完整的功能read.tcsv

read.tcsv = function(file, header=TRUE, sep=",", ...) {
  n = max(count.fields(file, sep=sep), na.rm=TRUE)
  x = readLines(file)

  .splitvar = function(x, sep, n) {
    var = unlist(strsplit(x, split=sep))
    length(var) = n
    return(var)
  }

  x = do.call(cbind, lapply(x, .splitvar, sep=sep, n=n))
  x = apply(x, 1, paste, collapse=sep)

out = read.csv(text=x, sep=sep, header=header, ...)
out$ID<-tools::file_path_sans_ext(basename(file))
return(out)

} 

答案 1 :(得分:0)

1)如果只有2个数据集,那么最快的方法是在转换后但在绑定行之前在A和B数据集上添加一个ID列。

Dataset_A$ID<-"A"
Dataset_B$ID<-"B"
# Where Dataset_X is the name of your imported transformed datasets.

2)您能显示您使用的确切代码吗?如果您只有2个数据集,我认为您创建的代码可以大大简化。如果您对简化感兴趣,请向我们提供以下2个dput语句的输出:

A<-read.csv("A-dataset")
B<-read.csv("B-dataset")
dput(A)
dput(B)