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

R - convert string (chr) to data frame name and apply function to multiple data frames

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

以下是我读取文件名以"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", " ") ))
}

还有一个名为 "Answer_Worksheet_19"

的示例数据集
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<-as.list(markstimenames)

    lapply(名称(markstimelist),function(x) answeranalysis(markstimelist[[x]]))

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

  1. 使用当前answeranalysis(),将生成n个png条形图(n=包含'Q'的列数),即answeri.png,其中i是问题编号。

但是如果我将该函数应用于多个数据集,我该如何将工作表编号添加到 png 条形图的名称中?

例如answeranalysis(Answer_Worksheet_19) ---> 会生成8个png条形图,分别是worksheet19answer1.png、worksheet19answer2.png等

谢谢!

回答问题(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 = ""))