按名称取消选择列

Ale*_*lex 28 indexing r slice dataframe

有没有办法选择数据框的所有列,除了具有特定名称的列.

它是模拟的df[, -1],除了使用列名而不是索引?

csg*_*pie 52

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

R> dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)
Run Code Online (Sandbox Code Playgroud)

然后使用!运算符反转选择:

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

  B C D
1 1 1 1
2 2 2 2
3 3 3 3
Run Code Online (Sandbox Code Playgroud)

或者,您可以:


Ben*_*nes 8

可以使用该which()函数来识别要消除的列.

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

dd[, -which(names(dd) == "A")]
Run Code Online (Sandbox Code Playgroud)

或积极的

dd[, which(names(dd) != "A")]
Run Code Online (Sandbox Code Playgroud)

但是,如果没有名为"A"的列,则会得到一个包含0列和nrow(dd)行的数据框.因此,检查是否存在名为"A"的列会很好.

if(any(names(dd) == "A")) {
  dd[, which(names(dd) != "A")]
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*now 8

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

subset(airquality, Day == 1, select = -Temp)
Run Code Online (Sandbox Code Playgroud)


And*_*ico 5

删除A和C

base解决方案

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

df[,c("A","C")]<-NULL
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)