Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 组合多个文件并为每个文件添加唯一的ID_R_Csv_Dataframe - Fatal编程技术网

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

R 组合多个文件并为每个文件添加唯一的ID,r,csv,dataframe,R,Csv,Dataframe,我是R的新手。我在合并数据时遇到问题,希望有人帮助解决。 假设我有两个CSV文件,如A.CSV和B.CSV,位于路径“C:\Users\Public\A”处。 它们看起来是这样的: A.csv T,2015201620172018 X1,1,2,3,2 X2,1,2,2,3 X3,1,3,4,2 B.csv T,201520162017 X1,2,4,3 X2,2,2,3 X3,3,3,4 然后我尝试将它们结合起来,并用以下函数将它们转置。他们是由里卡多·奥利维罗斯·拉莫斯和托尼·库克森分别在美

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

A.csv

T,2015201620172018
X1,1,2,3,2
X2,1,2,2,3
X3,1,3,4,2

B.csv

T,201520162017
X1,2,4,3
X2,2,2,3
X3,3,3,4

然后我尝试将它们结合起来,并用以下函数将它们转置。他们是由里卡多·奥利维罗斯·拉莫斯和托尼·库克森分别在美国和英国创作的。 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)

}
二,。然后我使用
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)
}
  • 结果看起来不错:
  • i..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月4日

  • 但是,我想添加一列作为每个文件的标识符,并使用它们的文件名(或唯一ID),如下所示:
  • i..T ID X1 X2 X3
    2015 A 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 4

    谁来帮帮我!?提前谢谢

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

    Dataset_A$ID<-"A"
    Dataset_B$ID<-"B"
    # Where Dataset_X is the name of your imported transformed datasets.
    
    Dataset\u$ID感谢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)
    
    } 
    
    read.tcsv=function(文件,头=TRUE,sep=“,”,…){
    n=max(count.fields(file,sep=sep),na.rm=TRUE)
    x=读线(文件)
    .splitvar=函数(x,sep,n){
    var=未上市(strsplit(x,split=sep))
    长度(var)=n
    回报(var)
    }
    x=do.call(cbind,lappy(x,.splitvar,sep=sep,n=n))
    x=应用(x,1,粘贴,折叠=sep)
    out=read.csv(text=x,sep=sep,header=header,…)
    
    事实上,我在文件夹A中有350多个CSV文件,所以我必须使用函数
    multrbind.fill
    一次组合所有文件。我使用
    tools
    file\u path\u sans\u ext(list.files(file.path(mypath))调用这些文件的名称
    。但是,我不知道如何正确地将其添加到数据帧中。以下是我的结果的输出:
    dput(multirbind(“C:/Users/Vu Quang Vinh/Desktop/A”))结构(列表(ï..T=C(2015L,2016L,2017L,2018L,2015L,2016L,2017L),X1=C(1L,2L,3L,2L,4L,3L),X2=C(1L,2L,2L,2L,3L),3L),X3=C(1L,2L,2L,2L,3L)(1L,3L,4L,2L,3L,3L,4L)),class=“data.frame”,row.names=c(NA,-7L))
    当您在一个步骤中完成所有操作,而我无法访问csv文件时,很难复制。
    read.tcsv(file=x,header=t)}
    在这两行之间,您应该添加类似于
    x$id的内容。您可以创建我上面提到的两个CSV文件,如A.CSV和B.CSV。然后使用
    read.tcsv
    以及
    mulrbind.fill
    来复制结果。我也尝试了您的建议,但无效:(。
    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)
    
    }