按名称取消选择列

时间:2012-03-21 13:23:00

标签: r indexing dataframe slice

是否可以选择数据框的所有列,但具有特定名称的列除外。

除了使用列名而不是索引?

之外,它将是df[, -1]的模拟

5 个答案:

答案 0 :(得分:49)

您可以使用矢量子集来完成此操作。首先,创建一个虚拟数据集:

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"))]
    

答案 1 :(得分:8)

可以使用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")]
}

答案 2 :(得分:7)

subset函数已经允许这种类型的语法,来自帮助页面上的示例:

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

答案 3 :(得分:3)

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

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

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

除了@csgillespie建议之外,这是另一种方式。

答案 4 :(得分:2)

删除A和C

base解决方案

df <- data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

df[,c("A","C")]<-NULL

data.table解决方案

dt <- data.table(A = 1:3, B = 1:3, C=1:3, D=1:3)

#    A B C D
# 1: 1 1 1 1
# 2: 2 2 2 2
# 3: 3 3 3 3

dt[,c("A","C"):=NULL]

#   B D
#1: 1 1
#2: 2 2
#3: 3 3