8

如何从列表中获取数据框的名称?当然,get()获取对象本身,但我希望在另一个函数中使用它的名称。这是用例,以防您建议解决方法:

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

每个数据框中有一列与列表中的数据框同名。我怎样才能得到这个名字bynameofXnames(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)
4

3 回答 3

6

我会以这种方式使用列表的名称:

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
于 2012-01-25T12:13:17.120 回答
3

这是 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))
于 2015-10-09T03:18:51.297 回答
1

您可以首先使用 names(list)->list_name 然后使用 list_name[1] 、 list_name[2] 等来获取每个列表名称。(如果您的列表名称是数字,您可能还需要 as.numeric(list_name[x]) 。

于 2015-10-09T03:08:08.620 回答