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=""))
}
}
基本上我遇到的问题有两个:
为了将函数 answeranalysis 应用于数据集,我尝试这样做:
markstimelist<-as.list(markstimenames)
lapply(名称(markstimelist),function(x) answeranalysis(markstimelist[[x]]))
但显然它不起作用,因为存储在列表中的项目只是数据集的名称(字符串,字符)而不是数据集本身。
因此,如何使用字符串访问数据集?
- 使用当前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 = ""))
我正在尝试从我的本地目录读取 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=""))
}
}
基本上我遇到的问题有两个:
为了将函数 answeranalysis 应用于数据集,我尝试这样做:
markstimelist<-as.list(markstimenames)
lapply(名称(markstimelist),function(x) answeranalysis(markstimelist[[x]]))
但显然它不起作用,因为存储在列表中的项目只是数据集的名称(字符串,字符)而不是数据集本身。 因此,如何使用字符串访问数据集?
- 使用当前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 = ""))