【问题标题】:How to get the name of a data.frame within a list?如何在列表中获取 data.frame 的名称?
【发布时间】:2012-02-18 14:36:06
【问题描述】:

如何从列表中获取数据框的名称?当然,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)

【问题讨论】:

    标签: r indexing plyr lapply


    【解决方案1】:

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

    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
    

    【讨论】:

    • llply(mylist, .fun=ddply, c(2,3), summarize, checkSum=sum(value)) 也可以,但可能更令人困惑
    • @ran2 我不这么认为,因为要使用的名称因列表而异。
    【解决方案2】:

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

    【讨论】:

    • 这行不通,除非该列表具有首先给出的名称
    【解决方案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-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 2019-11-10
      • 2015-12-12
      • 2019-06-03
      相关资源
      最近更新 更多