R - 将字符串(chr)转换为数据帧名称并将函数应用于多个数据帧

时间:2016-01-25 14:56:54

标签: r readfile lapply

我正在尝试从我的本地目录中读取csv文件(其文件名包含某些字符),并将函数应用于所有数据集。

以下是我如何读取文件名以&#34开头的文件; Answer_Worksheet": (在目录C:/ Users / User / Downloads中,有文件名为Answer_Worksheet_19,Answer_Worksheet_20,Answer_Worksheet_21等)。

answercsv <- list.files(path="C:/Users/User/Downloads",
    pattern="Answer_Worksheet+.*csv",full.names=FALSE)
answernames <- substr(answercsv,1,nchar(answercsv)-4)

#read files
for(j in answernames){
    ansfilepath <- file.path("C:/Users/User/Downloads",paste(j,".csv",sep=""))
    assign(j, read.table(ansfilepath,header=TRUE,sep=",",na.strings=c("NA","NaN", " ") ))
}

一个名为&#34; Answer_Worksheet_19&#34;

的示例数据集
ID  Q1  Q2  Q3  Q4  Q5  Q6  Q7  Q8
491 10  3   1   5   3   1   10  2
491             4               
480 10  3   1   33  3   1   10  /
488 4   3   1   5   3   1   10  5
488 3           6               
482             5   3   1   10  5
482 10          33      1       
492 4   3   1   33  6   2   10  5
488 10          33              
488                             
492 10                          
492                 3   1       
509 10  3   1   33  3   1   10  5
498                             
500 10  3   1   33  3   1   10  5
498                             
500                             
503 10  3   1   33  3   1   10  5
498 10  3   1   33  6   1   10  5

要应用的功能:

library(ggplot2)
library(plyr)

answeranalysis<-function(data){

    #subset "Q" columns
    Q<-data[,grep("Q",names(data))]

    for(i in 1:NCOL(Q))
    {
        #histogram (frequency)
        count<-count(Q,i)
        colnames(count)[1]<-"ans"
        ggsave(ggplot(data=na.omit(count),aes(x=reorder(ans,-freq),y=freq))+geom_bar(stat="identity",fill="dodgerblue")+geom_text(aes(label=freq),vjust=0,size=7)+xlab("Answers")+ylab("Freq")+theme(axis.text=element_text(size=15,face="bold"),axis.title=element_text(size=16)),file=paste("C:/Users/User/Downloads/answer",i,".png",sep=""))

    }

}

基本上我遇到了两个问题:

  1. 为了将函数answeranalysis应用于数据集,我试图这样做:

    markstimelist&LT; -as.list(markstimenames)

    lapply(names(markstimelist),function(x)answeranalysis(markstimelist [[x]]))

  2. 但显然它不起作用,因为列表中存储的项目只是数据集(字符串,字符串)的名称,而不是数据集本身的名称。 那么,我如何使用字符串访问数据集?

    1. 使用当前的answeranalysis(),将生成n个png条形图(n =包含&#39; Q&#39;的列数),即answeri.png,其中i是问题编号。
    2. 但是,如果我将该函数应用于多个数据集,如何将工作表编号添加到png条形图的名称中?

      e.g。 answeranalysis(Answer_Worksheet_19)---&gt;将生成8个png条形图,即worksheet19answer1.png,worksheet19answer2.png等。

      谢谢!

1 个答案:

答案 0 :(得分:0)

回答问题(1):

您可以使用函数eval,它将文本评估为变量。 parse通常会解析文件,但您可以指定文本,例如此处。

EVAL<-function(z){eval(parse(text=z)))} lapply(names(markstimelist),function(x) clustering(EVAL(x))

问题2:

您可以添加for循环并以这种方式保存:

for(i in 1:length(worksheet)){ ggsave(paste("worksheet",i,"....png",sep = ""))