【问题标题】:Lists and matrix using sapply使用 sapply 的列表和矩阵
【发布时间】:2018-02-03 22:46:16
【问题描述】:

我有一个基本的问题,我在网上搜索过。我在读取文件时遇到问题。不过,我设法按照@Konrad 的建议阅读了我的文件,对此我表示赞赏:如何让 R 从一个大目录下的多个子目录中读取文件?

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

我的问题:

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

id X Y 时间温度

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)并进行分位数等计算。

我首先尝试读取“ress”中的所有子文件

后者没有出错,但我的主要问题是“data.filesf”不是矩阵而是列表,实际上第 5 列不是我所期望的。然后是:

matr5 <- do.call(rbind, subs5)

也没有给出所需的值/结果。

将列放入将成为巨大矩阵的最佳方法是什么?

【问题讨论】:

  • 前面:我建议你要么使用sapply(..., simplify=FALSE),要么使用lapply,否则这有点脆弱。例如,如果你向它传递一个包含 2+ 个文件名的向量,它应该返回一个 list,在这种情况下,你可以使用 data.filesf[[1]] 表示法访问每个文件;但是,如果运气不好,您的文件名列表只有一个长度,那么 sapply(没有 simplify=FALSE)将返回单个矩阵或 data.frame,而 data.filesf[[1]] 显然不会达到您的预期。
  • 我把自己搞糊涂了……请提供一些示例输入(例如,重复两次的虚拟 3x3 data.frame)和预期输出。

标签: r list matrix dataframe sapply


【解决方案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)

【讨论】:

  • 非常感谢 Parfait(以及所有)的解释和帮助。添加 $temp 检索到所需的值。
  • 太棒了!在 StackOverflow 上有一种特殊的方式来表示 thank you
【解决方案2】:

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

【讨论】:

  • 当只传递一个参数(如DF[5])时,data.frame 将返回另一个带有该列的data.frame
  • @Nathan。对不起,我不太明白你的意思。
  • 请在对象后加逗号。试试lapply(list(mtcars, mtcars),'[', , 5)。对象后面必须有逗号。你忘记放了。谢谢
  • @r2evans 声明是“我想提取这数千个文件中的每一个的第五列(temp)并进行分位数等计算”这就是他的声明写了
  • 不管怎样,OP 还说:“主要问题是“data.filesf”不是矩阵,而是 list(强调我的) ,您的答案没有改变,然后 “第 5 列不是我所期望的”,这表明没有人真正知道列或行之间的哪个是真正的意图。 (并且您的陈述“您实际上是在提取第 5 行” 是不正确的。)
猜你喜欢
  • 2019-09-08
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
相关资源
最近更新 更多