3

plyrを使用する利点は、リスト名が保持されることですllplylapply説明についてはを参照?llplyしてください。私はその機能が大好きですが、ネストされたリストの場合は機能しないようです。例:

library(plyr) 
m <- as.list(1:2)
names(m) <- c('M1', 'M2')
foo <- list(m, m)
names(foo) <- paste0("R", 1:2)


result <- ldply(foo, function(x){
        ldply(x, function(z) { data.frame(a=z, b= z^2)})
})
> result
  .id a b
1  M1 1 1
2  M2 2 4
3  M1 1 1
4  M2 2 4

# if I don't operate on the inner list, I can preserve the outer list's names
result2 <- ldply(foo, function(x){
     data.frame(a = x[[1]], b = x[[1]]^2)
    })
> result2
  .id a b
1  R1 1 1
2  R2 1 1

にはandresultが含まれていないことに注意してください(これは、の場合のように、の各要素内のネストされたリストを操作しなかったかのように追加されます)。ネストされたリストで作業しているときに、外部リスト名が追加されていることを確認するにはどうすればよいですか?R1R2.idfooresult2

4

2 に答える 2

5

列名が問題のようです。

result <- ldply(foo, function(x){
    df <- ldply(x, function(z) { data.frame(a=z, b= z^2)})
    names(df)[1] <- ".id2"; df
})
result
  .id .id2 a b
1  R1   M1 1 1
2  R1   M2 2 4
3  R2   M1 1 1
4  R2   M2 2 4
于 2012-10-18T21:44:20.367 に答える
3

問題は、変数がすでに存在する場合ldply、変数に割り当てられないことです。.idあなたがあなたの内なるものの1つの結果を一度見ればldply、それは大丈夫です:

> ldply(foo[[1]], function(z) { data.frame(a=z, b= z^2)})
  .id a b
1  M1 1 1
2  M2 2 4

邪魔にならないように名前を変更すると、期待どおりに機能します。

result <- ldply(foo, function(x){
    rename(ldply(x, function(z) { data.frame(a=z, b= z^2)}),
           c(".id" = ".id2"))
})

与える

> result
  .id .id2 a b
1  R1   M1 1 1
2  R1   M2 2 4
3  R2   M1 1 1
4  R2   M2 2 4
于 2012-10-18T21:46:06.607 に答える