3 Stimmen

Wie behalte ich Listennamen bei, wenn ich mit verschachtelten Listen arbeite?

Der Vorteil der Verwendung von plyr 's llply über lapply ist, dass die Listennamen erhalten bleiben. Siehe ?llply für eine Erklärung. Ich liebe diese Funktion, aber ich kann sie bei einer verschachtelten Liste nicht nutzen. Beispiel:

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

Beachten Sie, dass result enthält nicht R1 y R2 (die dann als .id wenn ich nicht die verschachtelte Liste innerhalb jedes Elements von foo wie im Fall von result2 ). Wie kann ich sicherstellen, dass die Namen der äußeren Listen hinzugefügt werden, wenn ich mit verschachtelten Listen arbeite?

5voto

Julius Vainora Punkte 46844

Es scheint, dass der Spaltenname das Problem ist:

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

3voto

Brian Diggs Punkte 55712

Das Problem ist, dass ldply nicht an den .id Variable, wenn es bereits eine gibt. Wenn Sie sich die Ergebnisse einer Ihrer inneren ldply einmal, dann ist es in Ordnung:

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

Benennen Sie es um, und es funktioniert wie erwartet.

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

gibt

> 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X