我有一个数据框trainSmall
,有六列。
> trainSmall
chr pos end LCR gc.50 type
1: 22 39491638 39491639 0 0 del_L
2: 22 29434028 29434029 0 0 ins
3: 22 28347247 28347248 0 0 del_R
4: 22 40121931 40121932 0 0 ins
5: 22 39122351 39122352 0 0 del_L
---
768: 22 27869380 27869381 0 0 del_R
769: 22 28823159 28823160 0 0 ins
770: 22 24319557 24319558 0 0 del_R
771: 22 38570330 38570331 0 0 del_L
772: 22 48182139 48182140 0 0 del_L
> is.data.frame(trainSmall)
[1] TRUE
我还有一个向量excl
,有四个项目。
> excl
[1] "chr" "pos" "end" "type"
我想要trainSmall
的所有行,但excl
中只有列。所以我试过
> trainSmall[, !colnames(trainSmall) %in% excl]
[1] FALSE FALSE FALSE TRUE TRUE FALSE
但这只是给了我另一个逻辑向量,而不是数据帧中的实际行。
即使在做
> trainSmall[, c(F,F,F,T,T,F)]
[1] FALSE FALSE FALSE TRUE TRUE FALSE
不能像我预期的那样工作。
我很困惑,因为这似乎是许多地方(如this answer)提出的用于对数据框进行子集化的方法。我做错了什么?
对可能的重复标记的响应:在这种情况下,似乎没有任何解决方案。
> trainSmall[, -which(names(trainSmall) %in% excl)]
[1] -1 -2 -3 -6
> trainSmall[ , !names(trainSmall) %in% excl]
[1] FALSE FALSE FALSE TRUE TRUE FALSE
答案 0 :(得分:1)
你可以去(注意括号):
df[, !(colnames(df) %in% excl)]
另一个有趣的方法是自己创建一个操作符(与%in%
相反):
excl <- c("chr", "pos", "end", "type")
'%!in%' <- function(x,y)!('%in%'(x,y))
mask <- colnames(df) %!in% excl
df[,mask]
两者都会产生
LCR gc.50
1: 0 0
2: 0 0
3: 0 0
4: 0 0
5: 0 0
答案 1 :(得分:1)
考虑到代码的输出,我认为您的数据采用data.table
格式(数据表同时包含数据框和数据表)。所以,这应该有效:
trainSmall[, !excl, with = FALSE]