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

时间:2017-03-05 12:45:22

标签: 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.txt       
Myexpdate2_R1.txt     
Myexpdate2_R2.txt       
Myexpdate2_R3.txt    

代码不会针对Myexpdate1运行,因为Myexpdate1_R1.txt不可用,但它将针对Myexpdate1_R2.txt运行,因为所有三个重复都可用。我尝试将包含模式list.files()的{​​{1}}文件的长度除以3,以便在它返回一个整数时运行而不是以其他方式运行但不幸的是我在通过正确识别整数时遇到了麻烦R.

提前致谢

1 个答案:

答案 0 :(得分:1)

假设您从文件名列表flist开始, 这应该给你一个d.f.如果您在一个实验中错过“R”,则execute列设置为0,否则为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

然后,您可以使用exec来决定是否运行模拟。例如,使用简单的for循环:

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")

    }
}
  

实验:Myexpdate1 - &GT;好的,跑步   “做某事”
  实验:Myexpdate2 - &GT; FAIL
  “无所事事”