我是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)
}
ï..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
ï..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
有人帮我!?提前致谢。
答案 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)