0

データフレームと、2つのデータフレームのリストを返すdf関数とがあります。dlplyを使用してid列を分割し、データフレームのリストのリストを返します。実際のデータとメソッドを概算するサンプルデータ/コードは次のとおりです。processabdf

df <- data.frame(id1=rep(c(1,2,3,4), each=2))

process <- function(df) {
  a <- data.frame(d1=rnorm(1), d2=rnorm(1))
  b <- data.frame(id1=df$id1, a=rnorm(nrow(df)), b=runif(nrow(df)))
  list(a=a, b=b)
}

require(plyr)
output <- dlply(df, .(id1), process)

outputはデータフレームのリストのリストであり、ネストされたリストには常にとという名前の2つのデータフレームがaありbます。この場合、外側のリストの長さは4です。

私が生成しようとしているのは、すべてのデータフレームと、それぞれの値を示す列を含むデータフレームです(これは属性としてリストに残っていると思いますa。str (output)を参照してください)。次に、データフレームについても同様です。idsplit_labelsb

これまでのところ、私はこの質問を部分的に使用して、このコードを考え出しました。

list <- unlist(output, recursive = FALSE)
list.a <- lapply(1:4, function(x) {
  list[[(2*x)-1]]
})
all.a <- rbind.fill(list.a)

これで最終的なデータフレームが得られますa(同様にb、に別の添え字を付けるlist場合)が、必要なid列がないため、より単純で洗練されたソリューションが必要になると確信しています。理想的にはを使用してきれいなものplyr

4

1 に答える 1

1

あまりクリーンではありませんが、このようなことを試すことができます (同じデータ生成プロセスを想定)。

list.aID <- lapply(1:4, function(x) {
cbind(list[[(2*x) - 1]], list[[2*x]][1, 1, drop = FALSE])
})

all.aID <- rbind.fill(list.aID)
all.aID

all.aID
        d1       d2 id1
1  0.68103 -0.74023   1
2 -0.50684  1.23713   2
3  0.33795 -0.37277   3
4  0.37827  0.56892   4
于 2012-08-13T13:31:02.173 に答える