我有多个使用
导入的文本文件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))
这是stats的slice1:
cellID X Y Area AVGFP DeviationGFP AvgRFP DeviationsRFP Slice GUI.ID
1 1 18.20775 26.309859 568 5.389085 7.803248 12.13028 5.569880 0 1
2 2 39.78755 9.505495 546 5.260073 6.638375 17.44505 17.220153 0 1
3 3 30.50000 28.250000 4 6.000000 4.000000 8.50000 1.914854 0 1
4 4 38.20233 132.338521 257 3.206226 5.124264 14.04669 4.318130 0 1
5 5 43.22467 35.092511 454 6.744493 9.028574 11.49119 5.186897 0 1
6 6 57.06534 130.355114 352 3.781250 5.713022 20.96591 14.303546 0 1
7 7 86.81765 15.123529 1020 6.043137 8.022179 16.36471 19.194279 0 1
8 8 75.81932 132.146417 321 3.666667 5.852172 99.47040 55.234726 0 1
9 9 110.54277 36.339233 678 4.159292 6.689660 12.65782 4.264624 0 1
10 10 127.83480 11.384886 569 4.637961 6.992881 11.39192 4.287963 0 1
所有其他数据集看起来都是一样的,除了它们都有不同的行长度(有些最多可达2000个单元格)
我想从每个data.frame(slice1 .... slice40)中取出1列并将其放入新的data.frame中。我希望新的data.frame具有列名,我希望新data.frame中的列名称称为slice1 ... slice40。
总结具体细节:
从每个slice1-40,我想从AVGFP获取所有值并将它们放入一个新的data.frame 新的data.frame应该被称为“AVGFP” 应该有40列标题为“slice1,slice2,...,slice40” 每个空单元格中应该有“NA”,这是因为一个切片比另一个切片短。
我非常感谢任何帮助。我一直在与apply
,plyr
,split
,reshape
,melt
,merge
和aggregate
进行摸索运气。
答案 0 :(得分:2)
如果您希望按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)
如果您只想将列粘贴在一起,请尝试以下操作:
首先获取数据帧的最大长度:
maxL <- max(sapply(stats, nrow))
现在创建一个列表,其中每列使用NA
扩展到最大长度:
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)