2012-03-21 109 views
15

有没有办法选择除具有特定名称的列之外的数据框的所有列:除了使用列名而不是索引外,它将是df[,-1]的类似物吗?通过名称取消选择列,R

回答

37

你可以使用矢量子集来做到这一点。首先,创建一个伪数据组:

R> dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3) 

然后用!操作者逆向选择:

R> dd[ ,!(colnames(dd) == "A")] 

    B C D 
1 1 1 1 
2 2 2 2 
3 3 3 3 

或者,你可以有:

  • 略短的版本(礼貌@Tomas):

    dd[ , names(dd) != "A"] 
    
  • 为了应付多个列(@Tyler提供)

    dd[ ,!(colnames(dd) %in% c("A", "B"))] 
    
7

人们可以使用which()功能确定柱加以排除。

dd <- data.frame(A = 1:5, B = 1:5, C=1:5) 

dd[, -which(names(dd) == "A")] 

或正

dd[, which(names(dd) != "A")] 

但是,如果没有一个名为 “A” 柱,你会得到一个数据帧0列和nrow(dd)行。所以最好检查一下名为“A”的列是否存在。

if(any(names(dd) == "A")) { 
    dd[, which(names(dd) != "A")] 
} 
5

subset功能已经允许这种类型的语法,从帮助页面上的例子:

subset(airquality, Day == 1, select = -Temp) 
0

对于取消选择多列,你可以使用dplyr包。举个例子:

dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3) 

library(dplyr) 
newdd <- select(dd, -A,-C) 

这是@csgillespie建议的另一种方式。