我的环境中有一系列名为EOG的数据框。从2006年到2012年,每年都有一个。例如,EOG2006,EOG2007 ...... EOG2012。我想将它们添加为列表的元素。
首先,我想知道这是否可行。我阅读了官方的R指南和几本R编程手册,但我没有找到明确的例子。
其次,我想使用for循环来做到这一点。不幸的是,我以前用来完成这项工作的代码是错误的,我很想解决它。
for (j in 2006:2012){
z<-j
sEOG<-paste("EOG", z, sep="")
dEOG<-get(paste("EOG", z, sep=""))
lsEOG<-list()
lsEOG[[sEOG]]<-dEOG
}
这将返回一个包含一个元素的列表。错误在哪里?
答案 0 :(得分:13)
您继续重新初始化循环中的列表。您需要将lsEOG<-list()
移到for
循环之外。
lsEOG<-list()
for (j in 2006:2012){
z <- j
sEOG <- paste("EOG", z, sep="")
dEOG <- get(paste("EOG", z, sep=""))
lsEOG[[sEOG]] <-dEOG
}
此外,您可以直接在j
函数中使用paste
:
sEOG <- paste("EOG", j, sep="")
答案 1 :(得分:12)
我有同样的问题,但觉得OP的初始代码对R初学者来说有点不透明。所以,这里可能是一个更清晰的示例,说明如何在循环中创建数据框并将它们添加到我刚才通过在R shell中玩弄所知的列表中:
> dfList <- list() ## create empty list
>
> for ( i in 1:5 ) {
+ x <- rnorm( 4 )
+ y <- sin( x )
+ dfList[[i]] <- data.frame( x, y ) ## create and add new data frame
+ }
>
> length( dfList ) ## 5 data frames in list
[1] 5
>
> dfList[[1]] ## print 1st data frame
x y
1 -0.3782376 -0.3692832
2 -1.3581489 -0.9774756
3 1.2175467 0.9382535
4 -0.7544750 -0.6849062
>
> dfList[[2]] ## print 2nd data frame
x y
1 -0.1211670 -0.1208707
2 -1.5318212 -0.9992406
3 0.8790863 0.7701564
4 1.4014124 0.9856888
>
> dfList[[2]][4,2] ## in 2nd data frame, print element in row 4 column 2
[1] 0.9856888
>
对于像我这样的R初学者,请注意访问第i个数据框需要双括号。基本上,双括号用于列表,而单括号用于向量。
答案 2 :(得分:0)
如果数据框保存为对象,您可以通过apropos("EOG", ignore.case=FALSE)
找到它们,并通过循环将它们存储在列表中:
list.EOG<- apropos("EOG", ignore.case=FALSE) #Find the objects with case sensitive
lsEOG<-NULL #Creates the object to full fill in the list
for (j in 1:length(list.EOG)){
lsEOG[i]<-get(list.EOG[i]) #Add the data.frame to each element of the list
}
将每个名称添加到您可以使用的列表中:
names(lsEOG, "names")<-list.EOG