来自separare data.frames的列组合

来自separare data.frames的列组合,r,dataframe,plyr,multiple-columns,reshape,R,Dataframe,Plyr,Multiple Columns,Reshape,我有多个使用导入的文本文件 colnames<-c("cellID", "X", "Y", "Area", "AVGFP", "DeviationGFP", "AvgRFP", "DeviationsRFP", "Slice", "GUI-ID") stats <- apply(data.frame(list.files()), 1, read.table,sep="", header=F, col.names=colnames) names(stats) <- paste0(

我有多个使用导入的文本文件

colnames<-c("cellID", "X", "Y", "Area", "AVGFP", "DeviationGFP", "AvgRFP", "DeviationsRFP", "Slice", "GUI-ID")
stats <- apply(data.frame(list.files()), 1, read.table,sep="", header=F, col.names=colnames)
names(stats) <- paste0("slice",seq_along(1:40))
所有其他数据集看起来都一样,只是它们都有不同的行长度(有些可以达到2000个单元格)

我想从每个data.frame(slice1…slice40)中提取一列,并将其放入新的data.frame中。我希望新data.frame具有列名,并且希望新data.frame中的列名被称为slice1…slice40

具体总结如下:

从每个切片1-40中,我想从AVGFP中获取所有值,并将它们放在一个新的data.frame中 新的data.frame应称为“AVGFP” 应该有40列标题为“切片1,切片2,…,切片40” 由于一个切片比另一个切片短,每个空单元格中都应该有“NA”


我真的很感谢你的帮助。我一直在摸索
apply
plyr
split
重塑
融化
合并
,以及
聚合
,但运气不佳

如果要通过
cellID
进行匹配,请尝试以下操作:

L <- lapply(stats, `[`, c("cellID","AVGFP"))

AVGFP <- Reduce(function(x,y)
         merge(x,y,by="cellID",all=TRUE,suffixes=c(ncol(x),ncol(x)+1)), L)

names(AVGFP)[-1] <- paste0("slice", 1:40)
将列放在一个矩阵中:

M <- do.call(cbind, L)

M是根据
callID
匹配的AVGFP中的值?初步查看底部建议后,数据看起来很棒!有40列标记为slice1-slice40,其中有GFP数据,而NA中没有数据。当我尝试您的“AVGFP@user2813055 fixed”时,
merge
出现问题,因为它会在冲突的列名中添加默认后缀“.x”和“.y”,但不会检查新名称是否与其他列不冲突。hack
后缀=c(ncol(x),ncol(x)+1)
修复了这个问题,因为
x
在每一个缩减步骤中都会按列增长。感谢您的跟进。我很难理解使这项工作正常运行的命令。您是否介意浏览最初有效的第二组命令。我相信这会让我更好地理解前进的方向。@user2813055 w你不明白的hat命令?我看到maxL正在搜索统计数据中的最大行数。我不确定函数(x)在Lappy中是如何工作的。从我对Lappy的理解来看,函数(x)正在应用于统计数据。它看起来像函数(x)正在从每个切片1…40中获取AVGFP列,如果任何特定列中的最大行数小于max from stats,它将插入一个NA。我也不确定do.call函数是如何工作的,尽管我会尽全力研究它。
maxL <- max(sapply(stats, nrow))
L <- lapply(stats, function(x) c(x$AVGFP, rep(NA, maxL-nrow(x))))
M <- do.call(cbind, L)
AVGFP <- as.data.frame(M)
names(AVGFP) <- paste0("slice", 1:40)