如何使用先前为几百个类似数据集编写的命令生成相同类型的图形?

时间:2011-07-11 00:58:21

标签: file r graph command

我有几百个数据集在一个数据文件中,我需要首先获取每个数据集的子集,并且我已经编写了命令来生成图形和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

2 个答案:

答案 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

祝你好运