如何在列表中创建命名的data.frame对象而不是使用默认的数字索引?

时间:2016-08-16 20:35:56

标签: r dataframe dplyr

我编写了自定义函数,用于递归地执行data.frame对象列表的setdiff操作。现在我的自定义函数返回未命名的data.frame对象列表。但是,我希望每个列表中的每个data.frame都必须具有非常特定顺序的名称。我知道我的自定义函数中必须进行一些更改才能在每个列表中返回命名的data.frame对象。我试着为他们指定名字,但这并不优雅。如何获得预期的输出?任何人都可以提出修改和改进自定义函数中的代码的可能想法吗?仅供参考,模拟所有数据,自定义功能,所需输出。

数据:

myList <- list(
  foo = data.frame( start=seq(1, by=4, len=6), stop=seq(3, by=4, len=6)),
  bar = data.frame(start=seq(5, by=2, len=7), stop=seq(7, by=2, len=7)),
  bleh = data.frame(start=seq(1, by=5, len=5), stop=seq(3, by=5, len=5))
)

我编写了这个自定义函数:

library(dplyr)

func <- function(list, idx=1L) {
  entry <- list[[idx]]
  self_ <- setdiff(entry, entry)
  res <- lapply(list[-idx], function(ele_) {
    joined_ <- setdiff(entry, ele_)
    joined_
  })
  result <- c(list(self_), res)
  return(result)
}

我的自定义函数的输出是:

res_1 <- func(list = myList, idx = 1L)
res_2 <- func(list = myList, idx = 2L)
res_3 <- func(list = myList, idx = 3L)

我希望我的自定义函数必须以非常不同的顺序显式指示每个列表中data.frame的名称,而不是默认的数字索引。

期望的输出:

res_1 <- list(foo=data.frame(), bar=data.frame(), bleh=data.frame())
res_2 <- list(bar=data.frame(), foo=data.frame(), bleh=data.frame())
res_3 <- list(bleh=data.frame(), foo=data.frame(), bar=data.frame())

如何实现所需的输出?有没有聪明的方法来解决我的自定义功能中的问题?我怎样才能做到这一点?非常感谢

1 个答案:

答案 0 :(得分:1)

正如其他评论员指出的那样,您需要使用=而不是<-来为您的列表指定命名元素,即

myList <- list(
  foo = data.frame( start=seq(1, by=4, len=6), stop=seq(3, by=4, len=6)),
  bar = data.frame(start=seq(5, by=2, len=7), stop=seq(7, by=2, len=7)),
  bleh = data.frame(start=seq(1, by=5, len=5), stop=seq(3, by=5, len=5))
)

完成后,您可以通过在函数中添加一行来获得所需的结果

func <- function(list, idx=1L) {
    entry <- list[[idx]]
    self_ <- setdiff(entry, entry)
    res <- lapply(list[-idx], function(ele_) {
        joined_ <- setdiff(entry, ele_)
    })
    result <- c(list(entry), res)
    names(result) <- c(names(list[idx]),names(list[-idx]))
    return(result)
}