0

を使用してインポートした複数のテキスト ファイルがあります。

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と呼びたいです。

詳細を要約すると:

各スライス 1 ~ 40 から、AVGFP からすべての値を取得し、それらを新しい data.frame に配置します。新しい data.frame は「AVGFP」と呼ばれる必要があります。ヘッダー「slice1、slice2、.. . , slice40" 1 つのスライスが別のスライスよりも短いことから生じる各空のセルには "NA" が存在するはずです。

すべての助けに本当に感謝しています。applyplyr、 、 、 splitreshapemeltmerge、と手探りしてきましたがaggregate、うまくいきませんでした。

4

1 に答える 1

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

次に、各列がNAs で最大長まで拡張されるリストを作成します。

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)
于 2013-09-28T16:32:57.340 に答える