【问题标题】:how to extract data from a list of dataframes如何从数据框列表中提取数据
【发布时间】:2019-07-25 09:36:47
【问题描述】:

第一次海报,长期奋斗者。

我正在尝试从最初从.asc 文件导入的数据框组成的列表中提取数据。我需要从所有文件的一列或多列中提取多行数据。

我可以使用sapply 函数提取单行列,但在从构成列表的数据的同一列中提取多行时遇到问题。我试图查看处理此问题的帖子,但找不到解决方案。

设置工作目录

setwd ("C/....")

请来.asc files (4,032 files, [80R, 48C] each)

temp <- list.files (pattern = "*.asc")

创建对象

myfiles <- lapply (temp, read.delim, header = False, skip = 6, sep = "")

检查格式(担心导入.asc文件)

print(myfiles)

结构很好,没有 NA 并且对齐

单行,所有文件的列

sapply(myfiles, function(x) x[35,14])

到这里为止,一切正常,我得到了我想要的——所有值的索引输出

 [1] 13  10  25  37  48  46  38  45  41  35  28  15  26

[14] 48  13  41  37  32  24  25  28  32  41  29  28  27 

我现在可以为第 14 列中的每行 36 到 42 创建一个新的代码行来满足我的需要,例如:

sapply(myfiles, function(x) x[36,14])
sapply(myfiles, function(x) x[37,14])
sapply(myfiles, function(x) x[38,14]), etc. to
sapply(myfiles, function(x) x[42,14])

但我想我应该能够一次提取这些并将它们导出为 .csv 文件。我的循环尝试失败了,因为我获得了整个列表的每一列和每一行的所有数据。另外,我可以为此添加不同的系列,例如 [52:62, 18:24] 并导出每个系列吗?

data1 <- sapply(myfiles, function(x)
{
x[35:42, 14] 
return(x)
})

有什么建议吗?非常感谢您的帮助。

【问题讨论】:

  • 或许可以试试sapply(myfiles, function(x) x[36:42,14])
  • 是的,我之前尝试过这个,还有涉及 '[' 的变体并且没有任何运气——这实际上有 [,1] [,2] [,3] 的输出我的文件限制为 [,4032]。基本上,函数循环遍历的文件数的索引。

标签: r data-extraction


【解决方案1】:

要选择多列,可以使用dplyr::select。例如,下面的代码将为您提供 1:3 列和 7:10 列以及 1:2 行。我不知道选择多行的方法。

sapply(myfiles, function(x) dplyr::select(x[1:2,], 1:3, 7:10))

【讨论】:

  • 这会引发错误:inds_combine(.vars, ind_list) 中的错误:位置必须介于 0 和 n 之间。这可能是因为我正在处理列表而不是数据框? sapply(myfiles, function(x) dplyr::select (x[35:42], 14))
  • 行选后忘记逗号了,修好了。
  • 你上面的修复方法超级有效,我有一个 csv 输出文件,但它混合了列和行,但数据在那里。谢谢!
【解决方案2】:

您可以使用purrr::map_dfr() 简化您的工作流程,这将为您提供一个包含从文件中提取的所有数据的单个数据框(更适合写入 csv 文件的对象)

library(tidyverse)

setwd ("C/....")
list_of_files <- list.files (pattern = "*.asc")


df <- list_of_files %>%
    setNames(nm = .) %>% 
    map_dfr(~{read.delim(.x, header = FALSE, skip = 6, sep = "") %>% 
            .[35:42, 14] %>%
            enframe()},
            .id = "file_name")

【讨论】:

  • 刚刚试了一下,效果很好。我不熟悉“管道”,但它运作良好,并且输出具有更好的形式。谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多