2014-10-29 2 views
2

Я хотел бы получить автоматический способ получить nrow() подмножества моих многочисленных наборов данных. У меня есть большое количество 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} применять функции?

В качестве бонусного вопроса, можно ли получить список ls() объектов на заказ? Потому что v хранит его в алфавитном порядке, поэтому более поздний rbind(v, sapply(...)) дает неправильные результаты.

Любые указатели приветствуются!

+1

Положите data.frames в список при их создании. – Roland

ответ

4

Попробуйте

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 
+0

Отлично, спасибо! 'mget()' действительно решает проблему! –