关于 r: 合并多个文件并为每个文件添加唯一 ID

Combining multifiles and add unique ID for each of them

我是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

然后我尝试将它们组合起来,并用以下函数转置它们。它们是在这里由 Ricardo Oliveros-Ramos 和在这里由 Tony Cookson 创建的。
1. 首先,我创建函数 read.tcsv 来读取和转置 CSV 文件

中的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  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 来组合和填充缺失值

1
2
3
4
5
6
7
8
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)
}

  • 结果看起来不错:
  • ?ˉ..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

  • 但是,我想添加一个列作为每个文件的标识符,其文件名(或唯一 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

    谁来帮帮我!?提前致谢。


    感谢 TJ83 帮我修正功能。根据 TJ83 的评论,我添加了一个名为 ID 的标识符列。这是我的完整功能 read.tcsv

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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) 如果您只有 2 个数据集,那么最快的方法是在转换后但在绑定行之前在 A 和 B 数据集上添加 ID 列。

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

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

    1
    2
    3
    4
    A<-read.csv("A-dataset")
    B<-read.csv("B-dataset")
    dput(A)
    dput(B)