我有几百个数据集在一个数据文件中,我需要首先获取每个数据集的子集,并且我已经编写了命令来生成图形和csv文件。然后我想为其余的数据集生成相同类型的图形和csv文件。我想知道R中是否有一个可以使用的命令?
更具体地说,我已经为下面的特定子集编写了命令,然后我需要为其余的数据子集做同样的事情,我唯一需要改变的是修改子集名称,例如,将“seven”更改为“eight”,将“seventout”更改为“eightout”等等.R中是否有一个命令可以为我执行此操作? (所以我不需要重复自己修改名称,复制并将相同的东西粘贴到R中。)非常感谢你!
alldata <- read.csv(file="file.csv",header=T,sep=",")
seven<- subset(alldata, aserno==7, select=c(I,C,D)) # aserno==7, so I need to change 7 into different numbers included in the data file
sevenout <- subset(seven, I=="a" & D>0, select=c(I,C,D))
f <- function(sevenoutf) nrow(sevenoutf)
sevennumber <- ddply(sevenout,.(C), f)
colnames(sevennumber)[2] <- "N"
sevenout$N <- sevennumber$N [match(sevenout$C, sevennumber$C)]
sevenout=data.frame(sevenout,"time"=c(1:nrow(sevenout)))
plot(sevenout$time, sevenout$N, type="n")
lines(sevenout$time,sevenout$N) # the result that I need
write.csv(sevenout, "sevenM.csv", row.names=FALSE) # the result that I need
答案 0 :(得分:2)
你可以使用for循环来做这样的事情你想要清楚地看到你在做什么,并一步完成所有的迭代。如果它们位于同一目录中,您也可以读入文件名列表,并且该目录中没有其他内容。例如:
setwd("/my_docs/my_project_data/") # where all your data files are
my.files <- list.files()
setwd("/my_docs/my_project_graphs/") # somewhere to save your graphs
for(i in 1:length(my.files))
{
temp.dat <- read.csv(my.files[i])
YOUR FUNCTION
pdf(paste(Sys.Date(),"_",my.files[i],"_graph.pdf", sep="")) # naming the pdf that will be written out
plot(temp.dat$number, temp.dat$td, main=my.files[i])
dev.off()
write.csv(temp.dat, paste(Sys.Date(),"_",my.files[i],"_new_data.pdf", sep=""), row.names=FALSE)
}
根据您要保存它们的方式/位置,您可以通过更改开始,粘贴(“../ graphs /”,Sys ....和paste(“/)将它们发送到该粘贴命令中的不同目录。 ./new_data /“,Sys ....
至于你的功能,我仍然不清楚它在做什么,但希望你可以从这里适应它。
答案 1 :(得分:0)
尝试编写一个在内部调用子函数的包装函数。然后使用apply()函数之一(tapply,sapply等...)通过列表传递函数变量名称以满足您的需求
MyWrapperFunction <- function( infile) {
a <- read.csv(file = infile)
a1 <- subset(a, inout==2, select=c(A,C,D))
f.sum <- function(a1f) sum(a1f$D)
atd <- ddply(a1, .(a1$C), f.sum)
colnames(atd)[2] <- "td"
f.nrow <- function(a1f) nrow(a1f)
aC <- ddply(a1,.(a1$C), f.nrow)
colnames(aC)[2] <- "number"
a_A <- merge(atd, aC, by="a1$C")
myplot <- plot(a_A$number, a_A$td) # the result I need
# save as your desired image file, png, pdf, etc...
# e.g. pdf( myplot, file = paste( infile, "_plot.pdf, sep = "") )
# the result I need
write.csv(a_A,
file = paste( infile, "_output.csv, sep = ""),
row.names=FALSE) }
借用nzcoops中的一些代码:
setwd("/my_docs/my_project_data/") # where all your data files are
my.files <- list.files()
setwd("/my_docs/my_project_graphs/") # somewhere to save your graphs
apply( my.files, MyWrapperFunction)
以下是开始使用子集问题的通用函数的方法
anotherWrapperFunction <- function( data, subset.critera,...)
其中...是您要传递给函数的其他内容
data.subset <- subset( data, aserno == subset.critera, #etc...)
data.subset.subset <- subset( data.subset, #etc...)
顺便说一句,我不确定你为什么要在两个子步骤中执行此操作,你可以通过&amp;
在同一个调用中完成所有操作f <- function(sevenoutf) nrow(sevenoutf)
此外,您不需要将此作为函数f <- nrow(sevenoutf)
完成同样的事情
data.subset.subset.ddply <- ddply( data.subset.subset, #etc...)
colnames(data.subset.subset.ddply)[2] <- "N"
等......,
现在像以前一样写出剧情和csv文件
# save as your desired image file, png, pdf, etc...
# using the subset criteria in the file name so you can ID the plot
# e.g. pdf( myplot, file = paste( "subset", subset.critera, "_plot.pdf, sep = "") )
并像上面给我看到的那样使用write.csv
祝你好运