按列名称取消选择

35

有没有一种方法可以选择数据框中除了特定列名的所有列。

它类似于 df [,-1] ,只不过使用列名而不是索引?


我想提供data.table作为data.frame的替代方案。它提供了更好的选择功能。 - pepece
5个回答

61

您可以使用向量子集进行此操作。首先,创建一个虚拟数据集:

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

你不需要额外的逗号,你可以更直接地进行子集操作:dd[names(dd) != "A"] - undefined

10

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

9
subset函数已经允许这种语法,参见帮助页面上的示例:
subset(airquality, Day == 1, select = -Temp)

5

删除 A 和 C

基本解决方案

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

4

如果您需要取消选择多个列,可以使用dplyr包。例如:

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接