• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

如何从环境中获取数据帧列表以供后来的lapply()魔法使用?

r 来源:Christoph Safferling 4次浏览

我想要一个自动的方式来获取我的许多数据集的一个子集的nrow()。我有大量的DF都遵循一个命名方案,并且我想在这些方案上运行nrow()。这是我想出了:如何从环境中获取数据帧列表以供后来的lapply()魔法使用?

# 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}应用函数的对象?

作为奖励问题,是否可以按顺序获取ls()对象的列表?由于v按字母顺序存储,因此后面的rbind(v, sapply(...))会给出错误的结果。

任何指针非常感谢!


===========解决方案如下:

尝试

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

您可以使用data.framedo.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 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)