2017-08-25 60 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