2016-02-12 31 views
1

我有8000个data.frame S IN [R我的全球环境(.GlobalEnv)内,例如如何访问内部.GlobalEnv类data.frame的所有对象中的R

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

如何访问每个data.frame s?

我可以使用.GlobalEnv$"db1"访问data.frame,但它没用,因为我想对每一个进行线性回归。

回答

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

我能想到的最简单的方法是使用mget的基本for循环。

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()] 

也可以限制为只项与“DB”使用开始正则表达式模式

+0

我不明白这一点。您无法为环境设置子集。一旦你在'.GlobalEnv'中解决了错字,它仍然会给出错误。 –

5

你可以使用的eapplymget组合把所有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