2016-02-12 3 views
1

У меня есть 8000 data.frame сек в моей глобальной окружающей среды (.GlobalEnv) в R, напримерКак я могу получить доступ ко всем объектам класса data.frame внутри .GlobalEnv в R

head(ls(.GlobalEnv)) 
#[1] "db1" "db2" "db3" "db4" "db5" 
tail(ls(.GlobalEnv)) 
#[1] "db7996" "db7997" "db7998" "db7999" "db8000" 

Как я могу получить доступ к каждому из data.frame s?

Я мог получить доступ к data.frame с помощью .GlobalEnv$"db1", но это бесполезно, потому что я хочу провести линейную регрессию для каждого из них.

ответ

0

Я нашел другое решение:

db1 <- data.frame(x = c(1,2,3),y = c(1.1,1.2,1.3)) 
db2 <- data.frame(x = c(1,2,3,4),y = c(2,2.1,2.2,2.3)) 
db3 <- data.frame(x = c(1,2,3,4,5),y = c(3,3.1,3.2,3.3,3.4)) 
ls() 
#[1] "db1" "db2" "db3" 
nombres <- ls() 
eval(parse(text = nombres[1])) 
# x y 
#1 1 1.1 
#2 2 1.2 
#3 3 1.3 
lm(y~x,data = eval(parse(text = nombres[1]))) 

Спасибо!

1

Простейший подход, который я могу представить, был бы базовым циклом for с использованием mget.

for(df in ls(.GlobalEnv)){ 
    print(get(df)) 
} 

Вы можете применить любую операцию вам нравится на mget результате.

Примечание - это предполагает, что только переменные среды являются data.frames для ваших целей, как она не различает более ограничительный for цикл будет:

for(df in ls(.GlobalEnv)){ 
    if(is.data.frame(get(df))){ 
     print(head(get(df))) 
    } 
} 

который просто использует is.data.frame, чтобы проверить, объект действительно является data.frame.

0

Возможно:

.Globalenv[ls()] 

Можно также ограничить только предметы, начинающиеся с «дб» с использованием регулярных выражений модели

+0

Я не понимаю этого. Вы не можете подмножить среду. Как только вы исправили опечатку в '.GlobalEnv', она все еще дает ошибку. –

5

Вы можете использовать комбинацию eapply и mget поставить все data.frame S, которые присутствуют в глобальная окружающая среда в list:

x <- eapply(.GlobalEnv, 'is.data.frame') 
dflist <- mget(names(x[unlist(x)]), .GlobalEnv) 

Затем вы можете использовать, например, lapply(dflist, ...) для выполнения регрессии по каждому из них.


Очень краткий альтернативный подход, пополняемая @RichardScriven в комментариях является:

dflist <- Filter(is.data.frame, as.list(.GlobalEnv)) 
+0

милый, не думал о 'eapply' – cdeterman

Смежные вопросы