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