首页 > 解决方案 > 减少嵌套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
        )
  }
}

标签: rdataframedata-cleaning

解决方案


有些操作并不完全清楚。这是一个选项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可以在循环外创建一次并在绑定列时使用它


推荐阅读