【发布时间】:2012-04-06 00:34:54
【问题描述】:
有没有办法选择数据框中的所有列,除了具有特定名称的列。
它类似于df[, -1],除了使用列名而不是索引?
【问题讨论】:
-
我想提供data.table 作为data.frame 的替代品。它提供了更好的选择可能性。
标签: r indexing dataframe slice
有没有办法选择数据框中的所有列,除了具有特定名称的列。
它类似于df[, -1],除了使用列名而不是索引?
【问题讨论】:
标签: r indexing dataframe slice
您可以使用向量子集来做到这一点。首先,创建一个虚拟数据集:
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"))]
【讨论】:
可以使用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")]
}
【讨论】:
subset 函数已经允许这种类型的语法,来自帮助页面上的示例:
subset(airquality, Day == 1, select = -Temp)
【讨论】:
要取消选择多个列,您可以使用 dplyr 包。举个例子:
dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)
library(dplyr)
newdd <- select(dd, -A,-C)
这是@csgillespie 建议之外的另一种方式。
【讨论】:
删除 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
【讨论】: