我正在搜索几个大文件中的复制基因条目。在我的基因列表中有几个重复和至少一个triplcate条目。我只是希望能够找出代表什么行!'!
我收到错误:
Error in if (genes[i, 1] == genes[j, 1] && i != j) { :
missing value where TRUE/FALSE needed
我遇到了障碍。
genes <- combine[c(4)]
num_rows <- nrow(genes)
dup_combine <- vector(mode="character", length=100)
n=1
for (i in 1:num_rows) {
only_check_rows <- num_rows-1
for (j in i+1:only_check_rows) {
if (genes[i,1] == genes[j,1]&&i!=j) {
dup_combine[n] <- combine[i,1]
n=n+1
cat("i=",i,"j=",j,"\n")
}
}
}
答案 0 :(得分:4)
看起来您正在单个向量(genes
)中搜索重复项。有几种方法可以做到这一点。这是一些示例数据:
dat <- c(1,2,3,2,4,4,6,NA,8,NA,13)
table
将计算dat
中每个唯一值的出现次数。注意我使用exclude = NULL
强制它计算NA
值:
table(dat, exclude = NULL)
正如评论中所述,duplicated
也适用。此函数返回一个布尔向量,具体指明哪些条目是之前条目的副本。 fromLast = TRUE
告诉它从后到前看,而不是从前到后看。
duplicated(dat)
duplicated(dat, fromLast = TRUE)
您可以将这两个方向结合起来 all 重复的元素:
subset(dat, duplicated(dat) | duplicated(dat, fromLast = TRUE))
如果您正在使用数据框而不是单个向量,duplicated
可能是最佳选择。
修改的
以下是使用示例数据框的简短工作示例:
dat <- data.frame(x = c(1,2,3,4,4,5,6,5,9),
y = c(2,3,1,2,2,6,2,6,10))
> dat
x y
1 1 2
2 2 3
3 3 1
4 4 2
5 4 2
6 5 6
7 6 2
8 5 6
9 9 10
#Boolean vector of duplicated rows
duplicated(dat)
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
#Indices of duplicated rows
which(duplicated(dat))
[1] 5 8
#Look in both directions to get all dups (indices)
which(duplicated(dat) | duplicated(dat,fromLast = TRUE))
[1] 4 5 6 8
#The actual rows
subset(dat,duplicated(dat) | duplicated(dat, fromLast = TRUE))
x y
4 4 2
5 4 2
6 5 6
8 5 6
答案 1 :(得分:1)
如果您提供if
NA
,则会出现错误“缺少值,其中需要TRUE / FALSE”。我怀疑是
genes[i,1]
或
genes[j,1]
是NA
,即genes
中有NA
个。{如果要在可能存在NA
的位置测试相等性,可以使用
identical(genes[i,1], genes[j,1])
答案 2 :(得分:1)
正如@joran所写,你应该使用重复的。但是您的代码问题是因为索引错误......
当你在数组外面索引时,你会得到NA ...
这样的事情会更好:
for(i in seq_len(num_rows-1)) {
for(j in (i+1):num_rows) {
...
答案 3 :(得分:0)
我的猜测是你的数据中缺少值。 genes[i, 1]
或genes[j, 1]
返回null或NA。在它失败后,弄清楚i和j的值是什么,然后查看该行。我怀疑你能够回到错误的地方。