如果列表元素的名称中包含 "this text" 并传递给 for 循环中的下一个元素,如何检查 R?

How to check in R if the name of the list element contains "this text" in it and pass to the next element in a for loop?

我是 R 的新手,有一个包含 30 个元素的大列表,每个元素都是一个包含几百行和大约 20 列的数据框(这取决于数据框)。每个数据帧都以原始 .csv 文件名命名(例如“实验数据 XYZ QWERTY 01”)。我如何检查整个列表并仅过滤那些文件名中未包含特定文本的数据框,并向这些过滤后的数据框添加一个唯一的 id 列(id 值将是该文件名的前三个字符)?例如,列表中包含“XYZ QWERTY”作为名称一部分的所有 elements/dataframes/files 都不会被过滤,也不需要唯一 ID。我有这个伪样式代码:

for(i in 1:length(list_of_dataframes)){
  if 
  list_of_dataframes[[i]] contains "this text" then don't filter
  else
  list_of_dataframes[[i]] <- filter(list_of_dataframes[[i]], rule) AND add unique.id.of.first.three.char.of.list_of_dataframes[[i]]
}

对不起,如果这里使用的术语有点尴尬,但是刚开始编程和第一次在这里发帖,所以还有很多东西要学(作为奖励,如果你有任何好的resources/websites学习自动化和用 R 做类似的事情,我会很高兴得到一些好的建议!:-))

编辑:

我为过滤部分尝试的代码是:

for(i in 1:length(tbl)){
  if (!(str_detect (tbl[[i]], "OLD"))){
    tbl[[i]] <- filter(tbl[[i]], age < 50)
  }
}

但是出现一条错误消息,指出“参数不是原子向量;强制转换”和“条件的长度 > 1,并且仅使用第一个元素”。有什么方法可以让这段代码正常工作吗?

假设有一个名为 files 的目录包含这些 csv 文件:

'experiment 1.csv'  'experiment 2.csv'  'experiment 3.csv'
'OLDexperiment 1.csv'  'OLDexperiment 2.csv'

这将为您提供具有过滤条件的数据框列表(此处:文件名中不包含子字符串 OLD)。只需删除 ! 即可只包含旧实验。添加了一个包含文件路径的新列 ID:

library(tidyverse)

list.files("files")

paths <- list.files("files", full.names = TRUE)
names(paths) <- list.files("files", full.names = TRUE)
list_of_dataframes <- paths %>% map(read_csv)

list_of_dataframes %>%
  enframe() %>%
  filter(! name %>% str_detect("OLD")) %>%
  mutate(value = name %>% map2(value, ~ {
    .y %>% mutate(id = .x)
  })) %>%
  pull(value)

入门的好资源是免费书籍 R for Data Science

这是一种更简单的方法,无需列表即可获得符合相同条件的 table 个文件的大组合:

list.files("files", full.names = TRUE) %>%
  tibble(id = .) %>%
  # discard old experiments
  filter(! id %>% str_detect("OLD")) %>%
  # read the csv table for every matching file
  mutate(data = id %>% map(read_csv)) %>%
  # combine the tables into one big one
  unnest(data)