列表和矩阵使用sapply

时间:2017-08-25 20:26:34

标签: r list matrix dataframe sapply

我有一些基本问题,我在网上搜索过。我在阅读文件时遇到问题。虽然,我设法在@Konrad建议之后阅读我的文件,我很感激:如何让R从一个大目录下的多个子目录中读取文件?

这是一个类似的问题,但是,我还没有解决它。

我的问题:

我在不同的文件夹中有大量同名文件(" tempo.out")。这个tempo.out有5列/标题。它们都是1048行和5列的相同格式:

id X Y time temp

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)

我想提取这些数千个文件中的每一个的第五列(temp),并进行分位数等计算。

我首先尝试阅读&#34; ress&#34;

中的所有子文件

后者没有错误,但我的主要问题是&#34; data.filesf&#34;不是矩阵而是列表,实际上第5列不是我的预期。然后是以下内容:

matr5 <- do.call(rbind, subs5)

也未提供所需的值/结果。

什么可能是让列成为巨大矩阵的最佳方法?

2 个答案:

答案 0 :(得分:1)

尝试      lapply(data.filef,[ ,, 5) 希望这会有所帮助

答案 1 :(得分:1)

考虑扩展您定义的函数 readDatFile ,以提取第五列 temp ,并使用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)