r - 减少嵌套for循环R中不必要的重复读取文件
问题描述
我正在编写一些 R 代码来处理文件对、Excel 和 csv (Imotions.txt)。我需要从 Excel 中提取一列并将其成对合并到 csv 中。下面是我的缩写脚本:我的脚本现在是多项式时间,并且不断重复嵌套 for 循环的主体 4 次,而不是只执行一次。
基本上有没有一种通用的方法来考虑在一组可以翻译成这种语言和其他语言的文件上运行一些代码?
excel_files <- list.files(pattern = ".xlsx" , full.names = TRUE)
imotion_files <-list.files(pattern = 'Imotions.txt', full.names = TRUE)
for (imotion_file in imotion_files) {
for (excel_file in excel_files) {
filename <- paste(sub("_Imotions.txt", "", imotion_file))
raw_data <- extract_raw_data(imotion_file)
event_data <- extract_event_data(imotion_file)
#convert times to milliseconds
latency_ms <- as.data.frame(
sapply(
df_col_only_ones$latency,
convert_to_ms,
raw_data_first_timestamp = raw_data_first_timestamp
)
)
#read in paradigm data
paradigm_data <- read_excel(path = excel_file, range = "H30:H328")
merged <- bind_cols(latency_ms, paradigm_data)
print(paste("writing = ", filename))
write.table(
merged,
file = paste(filename, "_EVENT", ".txt", sep = ""),
sep = '\t',
col.names = TRUE,
row.names = FALSE,
quote = FALSE
)
}
}
解决方案
有些操作并不完全清楚。这是一个选项tidyverse
library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
out <- crossing(excel_files, imotion_files) %>%
mutate(filename = str_remove(imotion_file, "_Imotions.txt"),
raw_data = map(imotion_files, extract_raw_data),
event_data = map(imption_filess, extract_event_data),
paradigm_data = map(excel_files, ~
read_excel(.x, range = "H30:H328") %>%
bind_cols(latency_ms, .))
基于 OP 的代码,latency_ms
可以在循环外创建一次并在绑定列时使用它
推荐阅读
- python-3.x - 如何将模块导入为 Python 字典?
- macos - 使用 MacOS 在 Flutter 中复制 SelectableText
- javascript - 有办法只将部分字符串对象保存到异步存储中吗?
- c# - 在列表视图中显示反序列化列表的项目
- javascript - 我对此完全感到困惑,因为 else if 语句似乎破坏了程序?
- python - 当询问麦克风权限时,selenium webdriver 无法单击允许
- python - django测试客户端CRUD API,单元测试
- php - 使用 PhpSpreadsheet 表读取文件越界错误
- linux - 运行 mongo 命令后 Mongo 关闭并显示错误代码 (1)
- python-3.x - werkzeug.routing.BuildError:无法使用值 ['token'] 为端点“forgot_passwd”构建 url。您的意思是“注销”吗?