r - 无论条件如何,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"
解决方案
与您的最后一个问题一样,我有点困惑,我不确定您要做什么。
因此,假设您的数据如下所示:
# 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_major
is TRUE
,如果在 column 中找到 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_allele
and的内容REF
被解释为正则表达式模式。例如,这会导致错误,如果REF
contains**A
而不是A
.
推荐阅读
- php - 从 php 和 mysql 中找到完成百分比的平均值
- javascript - 如何强制 IFrame 中的超链接在新窗口中打开?
- mysql - MySql 根据月份获取总价格和订单数?
- netsuite - NetSuite 税率未显示
- python - 如何从 django view.py 运行管理命令
- java - 如何在 Google OR 工具的 VRP 中强制执行某些节点不应首先和最后访问的硬约束
- r - 在 R 代码下面进行什么计算
- javascript - Touch.enable 无法通过 Animate CC 在 CreateJS 中工作
- python - 如何获得用户输入信息并确认输入
- javascript - 如何从用户输入图像文件,然后用 javascript 对其进行 base64 编码?