2017-08-25 39 views
3

我有一個也許是基本的問題,我已經在網上搜索。我有一個閱讀文件的問題。雖然,我設法讀取我的文件,遵循@Konrad的建議,我很感激:如何讓R從一個大目錄下的多個子目錄中讀取文件?使用sapply的列表和矩陣

這是一個類似的問題,但是,我沒有解決它。

我的問題:

我有一大批具有相同名稱的不同文件夾中(「tempo.out」)的文件。這tempo.out有5列/標題。而且他們都具有1048行5列的格式相同:

ID XY時間溫度

setwd("~/Documents/ewat") 
dat.files <- list.files(path="./ress", 
       recursive=T, 
       pattern="tempo.out" 
       ,full.names=T) 
readDatFile <- function(f) { 
dat.fl <- read.table(f) 
} 

data.filesf <- sapply(dat.files, readDatFile)       

# I might not have the right sintax in sub5: 
subs5 <- sapply(data.filesf,`[`,5) 
matr5 <- do.call(rbind, subs5) 

probs <- c(0.05,0.1,0.16,0.25,0.5,0.75,0.84,0.90,0.95,0.99) 
q <- rowQuantiles(matr5, probs=probs) 
print(q) 

我想提取每個那些數以千計的文件中的第五列(臨時),並計算這樣的作爲分位數。

我第一次嘗試閱讀「RESS」

後者沒有給出錯誤,所有子文件的,但我的主要問題是「data.filesf」不是一個矩陣,但名單,居然第5列不我所期望的。然後如下:

matr5 <- do.call(rbind, subs5) 

也沒有給出所需的值/結果。

什麼可能是最好的方式來獲得列將成爲一個巨大的矩陣?

+1

鋒線:我建議要麼你'sapply(...,簡化= FALSE)'或使用'lapply',否則這是一個有點脆弱。例如,如果你傳遞一個2個文件名的向量,它應該返回一個*'list' *,在這種情況下,你可以用'data.filesf [[1]]'符號訪問每個文件。然而,如果運氣不好,你的文件名列表只有一個long,那麼'sapply'(no simplification = FALSE)將返回一個單一的矩陣或data.frame,data.filesf [[1]]會顯着沒有做你期望的事情。 – r2evans

+0

我已經把自己弄糊塗了......請給出一些樣本輸入(例如,重複兩次的虛擬3x3數據框)和預期的輸出。 – r2evans

回答

1

嘗試 lapply(data.filef,[ ,, 5) 希望這將有助於

+1

當只傳遞一個參數(如'DF [5]')時,'data.frame'將返回另一個'data.frame'與該列。 –

+0

@Nathan。對不起,我不太明白你的意思。 – Onyambu

+1

請在對象後面添加逗號。嘗試'lapply(列表(mtcars,mtcars),'[',,5)'。對象後面必須有一個逗號。你忘了放。謝謝 – Onyambu

1

考慮延長你定義的函數,readDatFile,提取第五縱隊,溫度,並直接分配到矩陣與sapplyvapply(因爲你提前知道所需的結構 - 數字矩陣長度等於nrows或1048)。然後,運行需要rowQuantiles

setwd("~/Documents/ewat") 

dat.files <- list.files(path="./ress", 
         recursive=T, 
         pattern="tempo.out", 
         full.names=T) 

readDatFile <- function(f) read.table(f)$temp # OR USE read.csv(f)[[5]] 

matr5 <- sapply(dat.files, readDatFile, USE.NAMES=FALSE)       
# matr5 <- vapply(dat.files, readDatFile, numeric(1048), USE.NAMES=FALSE) 

probs <- c(0.05,0.1,0.16,0.25,0.5,0.75,0.84,0.90,0.95,0.99) 
q <- rowQuantiles(matr5, probs=probs) 
+0

非常感謝你對Parfait(以及所有)的解釋和幫助。添加$ temp檢索所需的值。 – Amber

+1

太棒了!在StackOverflow上有一種特殊的方式來說[謝謝](https://meta.stackexchange.com/a/5235)。 – Parfait