2012-07-03 66 views
0

我正在使用名称非常相似(df1,df2,.. df7)的data.frames。因为大部分分析都会完成,所以我想尽可能自动化这个过程。我已经设法在读取文件时使用分配:在函数中使用循环调用具有相似名称的对象R

for(i in 1:7) { 
    NameFile <- paste("df",i,"_10/score.out", sep="") 
    OutFile <- read.table(NameFile, na.string="NA",header=TRUE,sep="\t") 
    NameVar <- paste("df",i,"_10", sep="") 
    assign(NameVar, OutFile) 
    } 

但是现在我也想在它们中执行操作/函数。例如子集:

for(i in 1:7) { 
       Newname <- paste("dfsmall",i,sep="") 
       dftemp <- subset(df[i], p == 0 & abs(sepscore) > 0.3) 
       assign(Newname, dftemp) 
       } 

我认为大部分是正确的,但是如何调用df [i]?也就是说,已经存在的名称为df1,df2(..)的对象?有没有更好的方法来做到这一点?

这里有一些类似的问题,但没有一个会适合我的问题。然后再次,我很容易错过显而易见的。

谢谢。

+0

这可能对你有用:http://stackoverflow.com/questions/5158830/identify-all-objects-of-given-class-for-further-processing – Chase

+0

有趣的追逐。特别是,我不知道可以使用lapply从对象列表中生成图(lapply(outList,plot))。再一次,我对lapply感到不舒服。 – fridaymeetssunday

回答

4

通过使用功能get(工作方式相同assign,但反向):

for(i in 1:7) { 
      get(paste("df",i,"_10",sep="")) -> df 
      Newname <- paste("dfsmall",i,sep="") 
      dftemp <- subset(df, p == 0 & abs(sepscore) > 0.3) 
      assign(Newname, dftemp) 
      } 
+0

它像一个魅力工作!我在其他帖子中阅读了get函数,但无法完全获得使用权。干杯! – fridaymeetssunday

3

假设你有一个分析,由于某种原因,有10个组件,我不叫他们df1df10,但为了在列表:

data_list = list(exp1 = data.frame(...), 
       exp2 = data.frame(...), 
       ..., 
       exp10 = data.frame(...)) 

现在正执行一个操作的所有实验包括编写执行的操作的功能,给出了一个元素的数据:

do_stuff = function(experiment_data) { 
    # do something 
} 

,并使用apply风格的循环,在这种情况下lapply

result = lapply(data_list, do_stuff) 

我觉得这种做法是很容易。

+0

对我来说太复杂了,因为我并不特别喜欢或不知道名单。我了解他们的优势,但我还没有完成。谢谢你,我会牢记这一点。 – fridaymeetssunday

+3

@ krespim,学习列表,学习lapply。从长远来看(甚至是中短跑),它会让你的生活更轻松,避免出现问题。看看Paul的答案,关键部分是1行,该行比使用assign更危险。 –

+0

我同意,分配的解决方案很难阅读imo。使用assign和get不那么透明,并且更容易出错。 –

相关问题