我正在处理名称非常相似的data.frames(df1,df2,... df7)。因为大部分分析都将在所有分析中完成,所以我希望尽可能地自动化该过程。我已经设法在读取文件时使用assign:
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 :(得分: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)
}
答案 1 :(得分:3)
假设您有一个分析,由于某种原因有10个组件,我不会将它们称为df1
到df10
,而是在列表中排序:
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)
我认为这种方法更容易。