我希望对我执行此操作的数据框进行子集化:
test = genes_names %in% annot2$Short_Name_Sc
summary(test) # 3140 rows to subset
## Mode FALSE TRUE NA's
## logical 2146 3140 0
test2 = annot2[test, 1]
nrow(annot2)
## [1] 5371
nrow(test2)
## [1] 3195 # There are 55 rows unexpected
令我惊讶的是test2
对象在TRUE
向量中的行数多于test
。我认为可能会出现[]
。
我尝试了子集:
probe = subset(annot2, test, 1)
但它的行数与前一代码相同。有什么解释吗?
数据非常大,所以我没有发布,不幸的是我没有设法制作一个可重复的例子。 数据集都是字符:
summary(annot2)
## Probe_ID Short_Name_Sc Systematic_Name_Sc
## Length:5371 Length:5371 Length:5371
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
summary(genes_names)
## Length Class Mode
## 5286 character character
答案 0 :(得分:1)
由于genes_names
和annot2[, 1]
的长度不同导致向量test
被部分回收,因此会出现此行为。向量test
和genes_names
的长度为5286,但nrow(annot2)
等于5371.因此,在调用annot2[test, 1]
时,结果实际为annot2[c(test, test[1:85]), 1]
(数字85来自差异长度; 85 = 5371 - 5286)。
使用mtcars
的可重现的示例,其具有32行:如果我们将test
定义为长度不等于32的某个逻辑向量,例如test <- c(T, T, F, F, T)
,然后mtcars[test, 1]
与mtcars[c(rep(test, 6), test[1:2]), 1]
相同,长度为20.向量test
会尽可能多地回收,以适应32行mtcars(即6次),返回18行(因为TRUE
中有3 test
个值)加上来自test
的前两个元素的2个额外行(因为32 = 2 mod 5)。