【问题标题】:Subset larger than the matches子集大于匹配
【发布时间】:2014-06-17 09:30:57
【问题描述】:

我想对我这样做的数据框进行子集化:

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 对象在 test 向量中的行数比 TRUEs 多。我认为这可能是[] 的子集。

我尝试使用子集:

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 

【问题讨论】:

  • 您的示例完全不可重现。此外,您正在使用genes_names、annot2、test 和annot2?使其可重现或至少显示清晰的思路。
  • 也许你想要test = annot2$Short_Name_Sc %in% genes_names,它将返回一个逻辑向量,指示Short_Name_Sc中的哪个genes_names
  • @konvas length(genes_names)[1] 5286 > nrow(annot2)[1] 5371 你是对的。这意味着%in%subset 省略了<Na>。我应该在使用& 命令进行子集化时这样做。如果您发布答案,我会接受。谢谢

标签: r subset


【解决方案1】:

观察到这种行为是由于genes_namesannot2[, 1] 的长度不同,导致向量test 被部分回收。向量testgenes_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行(因为在 test 中有 3 个 TRUE 值)加上来自 test 的前两个元素的另外 2 行(因为 32 = 2 mod 5)。

【讨论】:

  • 如果你让它更通用,它将帮助更多的人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多