R 组合多个文件并为每个文件添加唯一的ID
我是R的新手。我在合并数据时遇到问题,希望有人帮助解决。 假设我有两个CSV文件,如A.CSV和B.CSV,位于路径“C:\Users\Public\A”处。 它们看起来是这样的: A.csvR 组合多个文件并为每个文件添加唯一的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 然后我尝试将它们结合起来,并用以下函数将它们转置。他们是由里卡多·奥利维罗斯·拉莫斯和托尼·库克森分别在美
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日
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)
}