0

我正在使用名称非常相似的 data.frames(df1、df2、.. df7)。因为大部分分析都将完成,所以我想尽可能地自动化这个过程。我已经设法在读取文件时使用分配:

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(..) 的对象?有没有更清洁的方法来做到这一点?

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

谢谢。

4

2 回答 2

5

通过使用函数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)
          }
于 2012-07-03T14:19:10.070 回答
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)

我认为这种方法要容易得多。

于 2012-07-03T14:21:23.117 回答