2013-11-23 60 views
0

你好,你是美好的人。 我是新來的R和matlab,並在網上搜索來回答這個問題,但無法找到任何東西。問題是當我創建一個最終矩陣時,它只是列出了文件名。讀取文件名而不是文件中的數據

這背後的背景,讓你明白我的意思:

我使用R 3與內置的MATLAB和試圖從15讀取數據的.txt files.These 15個文件都具有數據和1686的兩列行。我應該使用dir()函數將這些文件放入類型列表的向量中。然後我訪問這個向量的每個元素並將其傳遞給read.table()函數,以便我可以創建一個包含數據的矩陣N.如前所述,這些文件有2列,我被告知要提取每個文件的第1列並將其放在一個名爲X的矩陣的第i列中.X有16行代表15個文件,一個標題行和1687列爲數據並解散第一列。

當我在R studio的控制檯位置鍵入X時,會出現X [i,] <-t(N [,1])中的錯誤:要替換的項目數不是替換長度的倍數。

我覺得夠公平了,我會將X改爲15×15的矩陣,而不是我想要的數據,而是包含一個包含.txt文件名的矩陣。 我試圖解決多重替換長度錯誤之前,首先要解決文件名的這個錯誤。 他們在我的代碼錯了嗎?我已經寫了下面的代碼,就好像爲15×15矩陣證明文件名稱問題,而不是16×1687作爲原:

# Clear workspace 
rm(list=ls()) 
# Close any open graphics devices 
graphics.off() 
# Load additional packages 
require(matlab, quietly=TRUE) 
# Activate functions 
source("auto.r") 
source("mncn.r") 
source("rangescale.r") 
source("hcluster2.r") 


filelist <- dir(path = "~/MSc/Course/Module3", pattern = "*.txt", all.files = FALSE, 
    full.names = FALSE, recursive = FALSE, 
    ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE) 

for (i in 1:length(filelist)) assign(filelist[i], read.table(filelist[i], sep="\t", header=T, row.names=1)) 

filelist <- as.matrix(filelist) 
N <- filelist 
X <- matrix (nrow = 15, ncol = 15) 
X[i,] <- t(N[,1]) 
+0

無後顧之憂的傢伙,fiiiiinaaaaaallly設法做到這一點花了我一個劇本的朋友送我的實驗小時。他們給我發了這個劇本。 –

回答

0

OOOOH,這就是我GOODNESS!我花了幾個小時,但設法通過試驗給我的腳本來解決這個問題! 我把它amendeded這樣:

sam <- dir(path = "~/MSc/Course/Module3", pattern = "*.txt", all.files = FALSE, 
       full.names = FALSE, recursive = FALSE, 
       ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE) 

X <- matrix(nrow=1, ncol=1686) 

for (i in 1:length(sam)) {N <- read.table(sam[i], sep="\t", header=F, row.names=NULL) 
          X <- rbind (X, N[,2]) } 
rownames(X) <- c("temp", "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3", "E1", "E2", "E3") 
X <- X[-1,] 
1

試用申請功能,applysapplymapply

你想在這裏因爲你是用文件的列表工作的一個類似於

東西3210

因此,作爲一個例子:讓我做一些文本文件

dat1 <- data.frame(x = rnorm(10), 
        y = rnorm(10)) 
dat2 <- data.frame(x = rnorm(5), 
        y = rnorm(5), 
        z = rnorm(5)) 

tmp <- c('dat1','dat2') 
lapply(tmp, function(x) write.table(get(x), file = paste0(x,'.txt'), quote = F, row.names = F)) 

現在,這裏就是我會在你的情況做。

filelist <- dir(path = '.', pattern = "*.txt", all.files = FALSE, 
       full.names = FALSE, recursive = FALSE, 
       ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE) 
> filelist 
[1] "dat1.txt" "dat2.txt" 

datalist <- lapply(filelist, function(x) read.table(x, header = T)) 

> datalist[1] 
[[1]] 
x   y 
1 0.66407205 0.6380669 
2 -0.85676390 0.3987090 
3 1.23954448 0.7414505 
4 -0.11823676 -0.1658559 
5 1.41603036 0.5585108 
6 2.16411026 -1.0918350 
7 -0.54033389 0.3603718 
8 0.01530916 0.5687294 
9 0.06244237 -1.1000696 
10 -0.15826680 -2.5999726 

> datalist[2] 
[[1]] 
x   y   z 
1 0.09159357 -0.80349348 0.04728642 
2 0.21526376 -0.03353738 0.77563529 
3 0.17405957 -0.68228875 0.72500158 
4 -1.81829362 -1.59196023 -1.25275570 
5 -1.92814438 -0.07139163 -0.08759747 

如果你需要訪問個人數據集

> tmp <- datalist[[2]] 
> dim(tmp) 
[1] 5 3 
> names(tmp) 
[1] "x" "y" "z" 
> tmp$y 
[1] -0.80349348 -0.03353738 -0.68228875 -1.59196023 -0.07139163 
相關問題