2012-01-25 21 views
5

Jak mogę uzyskać nazwę ramki danych z listy? Oczywiście, get() pobiera sam obiekt, ale chcę mieć jego nazwę do użycia w ramach innej funkcji. Oto przypadek użycia, w przypadku, czy raczej sugerują obejścia:Jak uzyskać nazwę pliku data.frame na liście?

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

Jest to kolumna w każdej ramce danych, które przechodzi przez tę samą nazwę jak ramki danych w obrębie listy. Jak mogę uzyskać tę nazwę bynameofX? names(X) zwróci cały wektor.

EDIT: Tutaj jest powtarzalna przykład:

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) 

Odpowiedz

4

użyję nazwy listy w ten sposób:

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 

a następnie użyć lapply + ddply jak:

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

To pozostaje niesprawdzone bez powtarzalnej odpowiedzi. Ale powinno ci to pomóc we właściwym kierunku.

EDYCJA (ran2): Oto kod z użyciem odtwarzalnego przykładu.

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), summary, checkSum = sum (value)) 'działa również, ale może być bardziej mylące – baptiste

+0

, ale jest krótszy, ja lubię! –

+0

@baptiste: czy to działa również z indeksowaniem opartym na nazwach? –

0

można po prostu po pierwsze używać nazw (lista) -> LIST_NAME a następnie użyć LIST_NAME [1], LIST_NAME [2] itd., Aby uzyskać każdą nazwę listy. (Może trzeba as.numeric (LIST_NAME [x]), jeśli nazwy list są liczbami.

1

Oto dplyr równoważne

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)) 
Powiązane problemy