【问题标题】:If statement is always true regardless of condition无论条件如何,if 语句始终为真
【发布时间】:2021-10-04 14:03:40
【问题描述】:

我想我在这里发布了同样的问题:R Programming: Condition giving 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"

【问题讨论】:

    标签: r if-statement apply


    【解决方案1】:

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

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

    # 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_majorTRUE,如果major_allele 的内容在列REF 中找到。 match_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_alleleREF 的内容被解释为正则表达式模式。例如,如果 REF 包含 **A 而不是 A,这会导致错误。

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 2012-09-30
      • 1970-01-01
      • 2021-01-07
      • 2012-03-07
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2017-12-19
      相关资源
      最近更新 更多