1

我对 R 有点陌生,并试图学习,但我对如何解决我偶然发现的问题感到困惑。我正在尝试输入多个文件,以便我可以为每个文件制作一个直方图。该代码运行良好,尤其是只有一个文件,但我在输入多个文件时遇到了问题。

编辑:结束代码

library("scales")
library("tcltk")
File.names<-(tk_choose.files(default="", caption="Choose your files", multi=TRUE, filters=NULL, index=1))
Num.Files<-NROW(File.names)
dat <- lapply(File.names,read.table,header = TRUE)
names(dat) <- paste("f", 1:length(Num.Files), sep="")
tmp <- stack(lapply(dat,function(x) x[,14]))
require(ggplot2)
ggplot(tmp,aes(x = values)) + 
    facet_wrap(~ind) +
    geom_histogram(aes(y=..count../sum(..count..)))
4

2 回答 2

5

好吧,这里有一些东西可以帮助您入门(但我不能确定它是否适合您,因为您的代码不可重现):

dat <- lapply(File.names,read.table,header = TRUE)
names(dat) <- paste("f", 1:length(Num.Files), sep="")

tmp <- stack(lapply(dat,function(x) x[,14]))

require(ggplot2)
ggplot(tmp,aes(x = values)) + 
    facet_wrap(~ind) +
    geom_histogram()

在此行之后丢弃您写的所有内容:

File.names<-(tk_choose.files(default="", caption="Choose your files", multi=TRUE, filters=NULL, index=1))

并改用上面的代码。

其他一些解释(BlueTrin 解释了第一个错误):

for (i in Num.Files){
f<- read.table(File.names[i],header=TRUE)
}

这将遍历您的文件名并读取每个文件名,但每次循环都会覆盖前一个文件。您将只剩下最后一个存储在f.

colnames(f) <- c(1:18)
histoCol <- c(f$'14')

您不需要c()这里的功能。就够1:18了。但是作为列名的数字通常很尴尬,应该避免使用。

于 2012-08-09T14:48:46.857 回答
2
f(Num.Files) <- paste("f", 1:length(Num.Files), sep = "") : could not find function "f<-"

发生此特定错误是因为您尝试将字符串分配给函数的结果。

这应该将值加载到列表中:

library("lattice");
library("tcltk");
File.names<-(tk_choose.files(default="", caption="Choose your files", multi=TRUE, filters=NULL, index=1));
Num.Files<-NROW(File.names);

result_list = list();
#f(Num.Files)<-paste("f", 1:length(Num.Files), sep="");
#ls();

for (i in Num.Files) {
    full_path = File.names[i];
    short_name = basename(full_path);
    result_list[[short_name]] = read.table(full_path,header=TRUE);
}

运行此程序后,您可以键入不带引号的“result_list$”,然后按 TAB 键完成。或者,您可以使用 result_list[[1]] 例如访问第一个表。

result_list 是一个列表类型的变量,它是一个支持标签索引的容器,在这种情况下是文件名。(我用短文件名替换了完整文件名,因为完整文件名在列表中有点难看,但可以随意更改)。

注意不要将 f 用作变量, f 是创建函数时的保留关键字。如果您尝试将上述程序中的 result_list 替换为 f ,它应该无法工作。

我希望这足以让您开始使用其他解决方案!

于 2012-08-09T14:47:12.120 回答