2012-01-25 12 views
5

Come posso ottenere il nome di un frame di dati da un elenco? Certo, get() ottiene l'oggetto stesso, ma voglio avere il suo nome per l'uso all'interno di un'altra funzione. Ecco il caso d'uso, nel caso in cui si preferisce suggerire un lavoro intorno:Come ottenere il nome di un data.frame all'interno di un elenco?

lapply(somelistOfDataframes, function(X) { 
    ddply(X, .(idx, bynameofX), summarise, checkSum = sum(value)) 
}) 

C'è una colonna in ogni fotogramma di dati che va sotto lo stesso nome il frame di dati all'interno della lista. Come posso ottenere questo nome bynameofX? names(X) restituirebbe l'intero vettore.

EDIT: Ecco un esempio riproducibile:

df1 <- data.frame(value = rnorm(100), cat = c(rep(1,50), 
    rep(2,50)), idx = rep(letters[1:4],25)) 
df2 <- data.frame(value = rnorm(100,8), cat2 = c(rep(1,50), 
    rep(2,50)), idx = rep(letters[1:4],25)) 

mylist <- list(cat = df1, cat2 = df2) 
lapply(mylist, head, 5) 

risposta

4

userei i nomi della lista in questo modo:

dat1 = data.frame() 
dat2 = data.frame() 
l = list(dat1 = dat1, dat2 = dat2) 
> str(l) 
List of 2 
$ dat1:'data.frame': 0 obs. of 0 variables 
$ dat2:'data.frame': 0 obs. of 0 variables 

e quindi utilizzare lapply + ddply come:

lapply(names(l), function(x) { 
    ddply(l[[x]], c("idx", x), summarise,checkSum = sum(value)) 
    }) 

Questo rimane non testato senza una risposta riproducibile. Ma dovrebbe aiutarti nella giusta direzione.

MODIFICA (ran2): ecco il codice che utilizza l'esempio riproducibile.

l <- lapply(names(mylist), function(x) { 
ddply(mylist[[x]], c("idx", x), summarise,checkSum = sum(value)) 
}) 
names(l) <- names(mylist); l 
+2

'llply (mylist, .fun = ddply, c (2, 3), riepiloga, checkSum = sum (value)) 'funziona pure, ma potrebbe essere più confuso – baptiste

+0

ma è più breve, mi piace! –

+0

@baptiste: funziona anche con indicizzazione basata su nome? –

0

si può solo in primo luogo utilizzare nomi (elenco) -> list_name e quindi utilizzare list_name [1], list_name [2] ecc per ottenere ogni nome della lista. (Si può anche bisogno as.numeric (list_name [x]) Se i nomi della lista sono numeri.

1

Ecco la dplyr equivalente

library(dplyr) 

catalog = 
    data_frame(
    data = someListOfDataframes, 
    cat = names(someListOfDataframes)) %>% 
    rowwise %>% 
    mutate(
    renamed = 
     data %>% 
     rename_(.dots = 
       cat %>% 
       as.name %>% 
       list %>% 
       setNames("cat")) %>% 
     list) 

catalog$renamed %>% 
    bind_rows(.id = "number") %>% 
    group_by(number, idx, cat) %>% 
    summarize(checkSum = sum(value)) 
Problemi correlati