R 错误:需要 TRUE/FALSE 的地方缺少值

R Error: missing value where TRUE/FALSE needed

提问人:KennyG 提问时间:6/24/2023 更新时间:6/24/2023 访问量:44

问:

我有一个 300+ 对齐的 COI 序列的 phylip 格式文本文件。我正在尝试将序列压缩成单倍型,以便使用朋友编写的 R 脚本进行分析。我遇到麻烦的部分是程序将每个序列与以下序列进行比较,并确定它们是否相差超过 N 个字符。它将在抛出以下错误之前运行前几个序列:

`Error in if (dif.nuc1[p] == "N" | dif.nuc2[p] == "N") { : missing value where TRUE/FALSE needed`

对齐中没有间隙,因此不需要管理 N/A 数据。

知道问题是什么和/或如何解决它吗?或者,任何关于巩固单倍型计划的建议也将不胜感激。

先谢谢你。

下面是控制台输出:

>       if (sum(dif.nuc1=='N')==0 & sum(dif.nuc2=='N')==0){       
+       } else if (length(dif.nuc1)!=0){
+         counter<- 0
+         for (p in 1:length(dif.nuc1)){       
+           cat('p is', p, '\n')
+           if (dif.nuc1[p]== 'N'| dif.nuc2[p]== 'N'){
+             counter<- (counter + 1)
+           }
+         }  
+         if (counter == length(dif.nuc1)){        
+           hap.equiv<- c(hap.equiv, paste('Hap_', m, ' == Hap_', n, '  ', sep=''))
+         }
+       }
Error in if (dif.nuc1[p] == "N" | dif.nuc2[p] == "N") { : 
missing value where TRUE/FALSE needed

我尝试通过以下方式修改代码来管理 N/A 数据,但没有解决问题。

if (dif.nuc1[p] == 'N' | dif.nuc2[p] == 'N' | is.na(dif.nuc1[p]) | is.na(dif.nuc2[p])) {
if (sum(dif.nuc1 %in% c('N', 'NA')) == 0 & sum(dif.nuc2 %in% c('N', 'NA')) == 0) {
          } else if (length(dif.nuc1)!=0){
            counter<- 0
            for (p in 1:length(dif.nuc1)){
              cat('p is', p, '\n')
              if (dif.nuc1[p]== 'N'| dif.nuc2[p]== 'N'){
                counter<- (counter + 1)

我还仔细检查了我的数据,以确保没有歧义代码,也没有导致 NA 数据的间隙

r IF语句 比较 DNA序列 序列比对

评论

0赞 Mark 6/24/2023
我可以尝试提供帮助,但是,我需要它包含相关的代码和数据。参见:stackoverflow.com/questions/5963269/...
0赞 Greg 6/25/2023
@KennyG 首先,dif.nuc* 是一个什么样的对象它是一个字符串(即长度的向量),并且您想遍历其字符吗?或者它是 n 个字符串的“列”(即长度向量),并且您想遍历这些字符串?另外,请注意 |||. 之间的区别。当 并行运算逻辑向量时,当遇到 时,它会对逻辑标量 (, , ) 和“短路”运算。character1charactern|||TRUEFALSENATRUE
0赞 KennyG 6/25/2023
@Greg,dif.nuc* 是一个字符向量,用于存储两个单倍型之间的差异,我相信它是随后存储在下游文件中的不同核苷酸数量的长度。感谢您指出这两个字符之间的差异,我将相应地修改我的代码。
0赞 Greg 6/26/2023
@KennyG 替换为 时,请务必将测试移至条件的开头;这样,您实际上就利用了短路。但可能最好的方法(对于像 这样的标量)是简单地使用条件 ,其中 只是自动处理 s。|||is.na()dif.nuc*[p]isTRUE(dif.nuc1[p] == "N") || isTRUE(dif.nuc2[p] == "N")isTRUE()NA
0赞 Greg 6/26/2023
@KennyG我应该补充一点:可能有一种更有效的方法,使用向量化操作您能否通过粘贴 dput(head(dif.nuc1, n = 10)) 和 dput(head(dif.nuc2, n = 10)) 的输出来发布您的数据的“可重现示例”(“reprex”)?

答: 暂无答案