R 如果存在某些复制,则条件运行

R 如果存在某些复制,则条件运行,r,R,我有一个以这种方式命名的文件列表: Myexpdate1_R1.txt Myexpdate1_R2.txt Myexpdate1_R3.txt Myexpdate2_R1.txt Myexpdate2_R2.txt Myexpdate2_R3.txt 我怎么能要求R只为三个复制品可用的实验运行管道,而不为其他实验运行管道?换言之,如果情况如下: Myexpdate1_R2.txt Myexpdate1_R3.

我有一个以这种方式命名的文件列表:

Myexpdate1_R1.txt        
Myexpdate1_R2.txt     
Myexpdate1_R3.txt       
Myexpdate2_R1.txt     
Myexpdate2_R2.txt       
Myexpdate2_R3.txt      
我怎么能要求R只为三个复制品可用的实验运行管道,而不为其他实验运行管道?换言之,如果情况如下:

Myexpdate1_R2.txt     
Myexpdate1_R3.txt       
Myexpdate2_R1.txt     
Myexpdate2_R2.txt       
Myexpdate2_R3.txt    
由于Myexpdate1_R1.txt不可用,代码将不会为Myexpdate1运行,但将为Myexpdate1_R2.txt运行,因为所有三个副本都可用。我尝试将包含模式
*R[1-3].txt的文件的
list.files()
长度除以3,以便在返回整数时运行,否则不运行,但不幸的是,在用R正确识别整数的过程中遇到了麻烦


提前感谢

假设您从文件名列表开始
flist, 这将为您提供一个d.f.,
execute
列设置为
0
,如果您在一次实验中漏掉了一个“R”,则为
1
。例如:

flist <- c("Myexpdate1_R1.txt", "Myexpdate1_R2.txt", "Myexpdate1_R3.txt",       
           "Myexpdate2_R1.txt", "Myexpdate2_R2.txt") 

library(dplyr)
library(stringr)
library(tibble)
flist <- c("Myexpdate1_R1.txt", "Myexpdate1_R2.txt", "Myexpdate1_R3.txt",       
           "Myexpdate2_R1.txt", "Myexpdate2_R2.txt") 

exec <-  flist %>% 
  str_split_fixed("_",2) %>% 
  as_tibble() %>% 
  mutate(replicas = str_split_fixed(V2, ".txt",2)[,1]) %>% 
  group_by(V1) %>% 
  dplyr::summarise(execute = ifelse (n() == 3, 1, 0))

> exec
# A tibble: 2 × 2
  Experiment execute
       <chr>   <dbl>
1 Myexpdate1       1
2 Myexpdate2       0
实验:Myexpdate1-->正常,运行
“做点什么”
实验:Myexpdate2-->失败
“无所事事”


现在还不清楚。可能是
sapply(split(files,sub(“.*”,“”,files)),函数(x)length(unique(x))==3
或者可能是
lappy(split(files,sub(“.*”,“”),files)),函数(x)if(length(unique(x)),lappy(x,read.table,stringsAsFactors=FALSE))
标题中的意思是“如果存在一些文件”?刚刚编辑以借用较短的“模式检查”来自@akrunHi LoBu。我尝试运行您向我建议的代码,但如果我想添加一个新条件,即管道将仅在Myexpdate2上运行,我有三个副本,而不是在Myexpdate1上运行。我必须如何修改您编写的代码?您好。对不起,我不明白。您希望添加的进一步条件是什么?按照当前的方式,只有当Myexpdate1和Myexpdate2有3个副本时,我的管道才能工作(这只是两个示例)。虽然Myexpdate2有3个副本,但它不能完全工作。我只想在有3个重复的实验(本例中是Myexpdate2)上运行管道,而不想在少于3个重复的实验上运行管道。这是我原来问题的附加要求,明白了。从你最初的问题来看,似乎只有在所有实验都有三个重复的情况下才能运行。你只需要移除管道的最后一行。这样,您将有一个df,其中一个用于三个副本的实验,否则为0。您可以使用它来决定运行哪些实验。如果你更新了问题,我会更新答案。
names(exec)[1] <- "Experiment"
for (exp in seq(along = exec$Experiment)){

  if (exec[exp,]$execute == 1){
    message("Experiment:", exec[exp,]$Experiment,"--> OK, RUN")
    print("DOING SOMETHING")
  } else{
    message("Experiment:", exec[exp,]$Experiment,"--> FAIL")
    print("DOING NOTHING")

    }
}