【问题标题】:how to get list of data frames out of the environment for later lapply() magic?如何从环境中获取数据帧列表以供以后使用 lapply() 魔术?
【发布时间】:2014-12-25 00:50:36
【问题描述】:

我想获得一种自动化方式来获取我的许多数据集的一个子集的nrow()。我有大量都遵循命名方案的 DF,我想在每个 DF 上运行 nrow()。这就是我想出的:

# generate two relevant and one irrelevant DF
test_5 <- data.frame(rnorm(5))
test_10 <- data.frame(rnorm(10))
irrelevant_df <- data.frame(rnorm(5))

# I want this, but automatically over all test_ DFs
nrow(test_5)
nrow(test_10)

# get all DFs that follow the 'test_' naming scheme
v <- grep('test_', ls(), value = TRUE)
v
l <- as.list(grep('test_', ls(), value = TRUE))
l

# works, but is manual
sapply(list(test_5, test_10), function(x) nrow(x))
# doesn't work (returns NULL), because l,v is stored as chr?
sapply(v, function(x) nrow(x))
sapply(l, function(x) nrow(x))

有没有办法从 ls() 获取对象,以便我可以将结果推送到 {s,l}apply 函数?

作为一个额外的问题,是否可以按顺序获取ls() 对象的列表?因为v 按字母顺序存储它,所以后面的rbind(v, sapply(...)) 给出了错误的结果。

非常感谢任何指针!

【问题讨论】:

  • 在创建 data.frames 时将它们放在一个列表中。

标签: r lapply sapply


【解决方案1】:

试试

lapply(mget(ls(pattern = "^test")), nrow)
## $test_10
## [1] 10
##
## $test_5
## [1] 5

你也可以使用data.frame或者do.call+rbind组合,如果你想再组合,比如

data.frame(lapply(mget(ls(pattern = "^test")), nrow))
##   test_10 test_5
## 1      10      5 

或者

do.call(rbind, lapply(mget(ls(pattern = "^test")), nrow))
##         [,1]
## test_10   10
## test_5     5

【讨论】:

  • 完美,谢谢! mget() 确实解决了问题!
猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
  • 1970-01-01
相关资源
最近更新 更多