【发布时间】: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