Как получить имя data.frame в списке? - PullRequest
5 голосов
/ 25 января 2012

Как я могу получить имя фрейма данных из списка? Конечно, get() получает сам объект, но я хочу иметь его имя для использования в другой функции. Вот вариант использования, если вы предпочитаете обойти это:

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

В каждом фрейме данных есть столбец, имя которого совпадает с именем фрейма данных в списке. Как я могу получить это имя bynameofX? names(X) вернул бы весь вектор.

РЕДАКТИРОВАТЬ: Вот воспроизводимый пример:

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)

Ответы [ 3 ]

5 голосов
/ 25 января 2012

Я бы использовал названия списка следующим образом:

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

, а затем использовал lapply + ddply, например:

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

Это остается непроверенным без воспроизводимого ответа.Но это должно помочь вам в правильном направлении.

РЕДАКТИРОВАТЬ (ran2): Вот код с использованием воспроизводимого примера.

l <- lapply(names(mylist), function(x) {
ddply(mylist[[x]], c("idx", x), summarise,checkSum = sum(value))
})
names(l) <- names(mylist); l
2 голосов
/ 09 октября 2015

Вот эквивалент dplyr

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))
1 голос
/ 09 октября 2015

вы могли бы просто сначала использовать имена (список) -> список_ имен, а затем использовать список_имя [1], список_имя [2] и т. Д., Чтобы получить каждое имя списка. (вам также может понадобиться as.numeric (list_name [x]), если имена в вашем списке являются числами.

...