【问题标题】:How to read files in two separate lists in a function based on a condition in R如何根据R中的条件读取函数中两个单独列表中的文件
【发布时间】:2022-10-07 20:27:34
【问题描述】:

好的,我希望我能够总结出我需要实现的目标。我正在进行实验,其中我从两个不同的来源获取数据,其中 date_time 是匹配的统一变量。两个独立来源中的数据具有相同的结构(在 csv 或 txt 中)。区别在于文件名。我在下面提供一个例子:

list_of_files <- structure(
  list
  (
    solid_epoxy1_10 = data.frame(
      date_time = c("20/07/2022 13:46",
                    "20/07/2022 13:56",
                    "20/07/2022 14:06"),
      frequency = c("30000",
                    "31000",
                    "32000"),
      index = c("1", "2", "3")
    ),
    solid_otherpaint_20 = data.frame(
      date_time = c("20/07/2022 13:10",
                    "20/07/2022 13:20",
                    "20/07/2022 14:30"),
      frequency = c("20000",
                    "21000",
                    "22000"),
      index = c("1", "2", "3")
    ),
    water_epoxy1_10 = data.frame(
      date_time = c("20/07/2022 13:46",
                    "20/07/2022 13:56",
                    "20/07/2022 14:06"),
      temperature = c("22.3",
                      "22.6",
                      "22.5")
    ),
    water_otherpaint_20 = data.frame(
      date_time = c("20/07/2022 13:10",
                    "20/07/2022 13:20",
                    "20/07/2022 14:30"),
      temperature = c("24.5",
                      "24.6",
                      "24.8")
    )
  )
)

首先,我想在两个单独的列表中读取数据文件。一个在文件名中包含关键字“solid”,另一个包含“water”。 然后我需要从每个数据帧中的文件名创建一个新列,该列将由“_”分隔(例如paint =“epox1”,thickness =“10”),通过它我可以通过 date_time 列进行内部连接、油漆、厚度等到目前为止,我基本上努力的是创建一个函数,将这些文件加载​​到两个单独的列表中。这是我迄今为止尝试过的

load_files <-
  function(list_of_files) {
    all.files.board <- list()
    all.files.temp <- list()
    for (i in 1:length(list_of_files))
    {
      if (exists("board")) {
        all.files.board[[i]] = fread(list_of_files[i])
      }
      else{
        all.files.temp[[i]] = fread(list_of_files[i])
      }
      return(list(all.files.board, all.files.temp))
    }
  }

但它不能满足我的需要。我希望我说得尽可能清楚。我对 tidyverse 包非常满意,但在编写自定义函数方面仍然是新手。欢迎任何想法。

【问题讨论】:

  • 您的函数在到达 return() 的那一刻返回,您可能希望将其移动一个 } ,这样它就不会脱离您的 for 循环。另外,当你准备这个 reprex 时,你是否错过了一些变化?如果您的fread()data.table::fread(),我认为它不能将列表作为输入/文件/文本参数处理。万一,你的意思是as.data.table(list_of_files[i])?这种方法会在您的输出列表中留下漏洞。
  • 感谢您的评论。我想这不是最大的代表,因为我保留了原始代码中的data.table::fread(),它适用于实际的数字数据。我应该只是示例数据中的 col_types 吗?将return() 移动一个} 会读取列表中的所有文件,这是一种改进,因为至少现在列表中的所有文件都已被读取。抱歉,如果有任何不清楚的地方,仍在努力使用正确的术语。

标签: r


【解决方案1】:

有些部分我不太清楚,所以我们可以从这里开始。
假设我们在 R 中得到了列表,第一部分是从名称中获取厚度和材料,这样的事情可能会有所帮助。我们在拆分之前这样做,因为它似乎应该在列表的所有元素中完成:

for (i in names(list_of_files)) {
  
 list_of_files[[i]]$material <- gsub(".*[_]([^.]+)[_].*", "\1", i)
 list_of_files[[i]]$thickness <- gsub("\D+"," ",i)
 print(i)
 
  }

然后我们可以按名称拆分固体列表和水列表:

solid_list <-list_of_files[grep('solid',names(list_of_files))]
water_list <-list_of_files[grep('water',names(list_of_files))]

那我就不上你想加入的了。

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2023-02-03
    • 2017-10-02
    • 1970-01-01
    • 2020-03-02
    • 2021-12-15
    相关资源
    最近更新 更多