首页 > 解决方案 > 无论条件如何,if 语句始终为真

问题描述

我想我在这里发布了同样的问题:R Programming: Conditiongiving always TRUE但我不知道如何将答案应用于我的情况。

下面的 if 语句在 major_allele 列中搜索 REF 的匹配项,反之亦然。问题是它总是评估为真,如带星号的行所示。上述链接中的先前答案表明 ifelse 总是产生一个向量,所以我猜测它只查看第一个观察值,评估为真,然后在所有行中进行相同的操作。但是,我希望它逐行进行。new_gwas_a1 下面是从所有行的 REF 列创建的,但对于带有星号的行,它应该是 false。

for (i in files){
rsid.tmp  <- read.table(i, header = TRUE, sep=" ", stringsAsFactors = 
FALSE, fill = TRUE)


rsid.tmp$new_gwas_a1 <-if((sapply(lapply(rsid.tmp$REF, grepl, 
x=rsid.tmp$major_allele),any))
                || (sapply(lapply(rsid.tmp$major_allele, grepl, 
x=rsid.tmp$REF),any)))
        {rsid.tmp$REF}

new_file <- sub("(\\.txt)$", "_updated\\1", i)
write.table(rsid.tmp, new_file, quote = FALSE, row.names = FALSE)


REF ALT minor_allele_frequency  minor_allele    major_allele     
new_gwas_a1
A   G   0.000219914 G   A   A
C   T   0.0144844   T   C   C
C   T   0.0445486   T   C   C
C   T   0.00647968  T   C   C
C   T   0.222656    T   C   C
**A G,T 0.12189     A   G   A
**A G,T 0.305252    A   G   A
C   T   0.00210762  T   C   C
C   A   0.00139373  A   C   C

我之前也收到过这个警告,从那以后就再也没有出现过,但我想知道这个问题是否相关。警告消息:在 if (sapply(lapply(rsid.tmp$REF, grepl, x = rsid.tmp$minor_allele), 中:条件的长度 > 1 并且仅使用第一个元素

我直接在 R 中尝试了相同的代码,它似乎可以工作。请看下面

> a <- c("TGTGTGT")
> b <- c("AC")
> c <- c("A")
> d <- c("AGTGTG,ATGTGT")
> e <- c("TG")

> if((sapply(lapply(a, grepl, x=c),any)) || (sapply(lapply(c, grepl, 
x=a),any))) {print(Yes)}

> if((sapply(lapply(b, grepl, x=c),any)) || (sapply(lapply(c, grepl, 
x=b),any))) {print("Yes")}
[1] "Yes"

标签: rif-statementapply

解决方案


与您的最后一个问题一样,我有点困惑,我不确定您要做什么。

因此,假设您的数据如下所示:

# A tibble: 9 x 6
  REF   ALT   minor_allele_frequency minor_allele major_allele new_gwas_a1
  <chr> <chr>                  <dbl> <chr>        <chr>        <chr>      
1 A     G                   0.000220 G            A            A          
2 C     T                   0.0145   T            C            C          
3 C     T                   0.0445   T            C            C          
4 C     T                   0.00648  T            C            C          
5 C     T                   0.223    T            C            C          
6 A     G,T                 0.122    A            G            A          
7 A     G,T                 0.305    A            G            A          
8 C     T                   0.00211  T            C            C          
9 C     A                   0.00139  A            C            C   

现在我们创建两个新列:match_REF_majoris TRUE,如果在 column 中找到 major_allele 的内容REFmatch_major_REF反之亦然。

library(dplyr)
library(stringr)

df %>% 
  mutate(match_REF_major = str_detect(REF, major_allele),
         match_major_REF = str_detect(major_allele, REF))

返回

# A tibble: 9 x 8
  REF   ALT   minor_allele_frequency minor_allele major_allele new_gwas_a1 match_REF_major match_major_REF
  <chr> <chr>                  <dbl> <chr>        <chr>        <chr>       <lgl>           <lgl>          
1 A     G                   0.000220 G            A            A           TRUE            TRUE           
2 C     T                   0.0145   T            C            C           TRUE            TRUE           
3 C     T                   0.0445   T            C            C           TRUE            TRUE           
4 C     T                   0.00648  T            C            C           TRUE            TRUE           
5 C     T                   0.223    T            C            C           TRUE            TRUE           
6 A     G,T                 0.122    A            G            A           FALSE           FALSE          
7 A     G,T                 0.305    A            G            A           FALSE           FALSE          
8 C     T                   0.00211  T            C            C           TRUE            TRUE           
9 C     A                   0.00139  A            C            C           TRUE            TRUE   

如有必要,很容易将这两个新列合并为一列。但是这种方式不是很稳定,因为major_alleleand的内容REF被解释为正则表达式模式。例如,这会导致错误,如果REFcontains**A而不是A.


推荐阅读