来自单独data.frames的列组合

时间:2013-09-28 15:57:14

标签: 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("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

所有其他数据集看起来都是一样的,除了它们都有不同的行长度(有些最多可达200​​0个单元格)

我想从每个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”,这是因为一个切片比另一个切片短。

我非常感谢任何帮助。我一直在与applyplyrsplitreshapemeltmergeaggregate进行摸索运气。

1 个答案:

答案 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)