2012-08-09 73 views
1

我對R有點新,想學習,但我很困惑如何解決我偶然發現的問題。我正在嘗試輸入多個文件,以便我可以爲每個文件創建一個直方圖。代碼運行良好,特別是只有一個文件,但是當我輸入多個文件時遇到問題。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..))) 
+2

這裏有很多錯誤(其中有些還沒有遇到,因爲它們會在產生錯誤的代碼之後發生),但是現在,您能否闡明您打算如何爲直方圖繪製多於一個_文件?它應該是每個文件第14列的一個直方圖嗎? – joran 2012-08-09 14:35:07

+0

@joran我想每個文件有一個直方圖,其中包括來自該特定文件的第14列的所有數據 – Stephopolis 2012-08-09 14:37:10

回答

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就足夠了。但是,作爲列名的數字通常很尷尬,應該可以避免。

+0

有沒有更好的方法來改變列名?正如我在問題中提到的那樣,列名有改變的傾向(不幸的是我不能對此做任何事情),但總是按照相同的順序。把名字換成數字是我想到的第一件事,但如果有更好的編程習慣,我會願意改變。 – Stephopolis 2012-08-09 14:55:44

+0

@Stephopolis只是預先考慮一個角色,就像你試圖用文件變量名一樣。即'colnames(f)< - paste(「X」,1:18,sep =「」)''。 – joran 2012-08-09 14:57:25

+0

如何讓ggplots在y軸上顯示百分比的直方圖?我試圖修改你的代碼是這樣的:ggplot(tmp,aes(x = values))+ facet_wrap(〜ind)+ geom_histogram()+ scale_y_continuous(labels = percent_format()) 但它只是添加了%符號在計數結束時。 – Stephopolis 2012-08-09 18:31:10

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是創建函數時的保留關鍵字。如果您嘗試用f替換上述程序中的result_list,它將無法工作。

我希望這是足夠的,與其他解決方案,讓你開始!

+0

我試圖製作一組f變量,因此當我循環閱讀時。表我將有一個文件值存儲在該變量中的數據。如果這是有道理的... – Stephopolis 2012-08-09 14:51:21

+1

我想也許你錯過了'列表'的一些括號? – joran 2012-08-09 14:54:26

+0

@joran:固定的,謝謝你指出這點 – BlueTrin 2012-08-09 14:54:48