协慌网

登录 贡献 社区

按名称删除数据框列

我有一些列要从数据框中删除。我知道我们可以使用以下内容单独删除它们:

df$x <- NULL

但我希望用更少的命令来做到这一点。

另外,我知道我可以使用整数索引来删除列,如下所示:

df <- df[ -c(1, 3:6, 12) ]

但我担心我的变量的相对位置可能会改变。

考虑到 R 的强大程度,我认为可能有一种更好的方法,就是逐一删除每一列。

答案

您可以使用简单的名称列表:

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
drops <- c("x","z")
DF[ , !(names(DF) %in% drops)]

或者,您也可以列出要保留的列表并按名称引用它们:

keeps <- c("y", "a")
DF[keeps]

编辑:对于那些仍然不熟悉索引函数的drop参数的人,如果要将一列保留为数据框,则执行以下操作:

keeps <- "y"
DF[ , keeps, drop = FALSE]

drop=TRUE (或不提及它)将丢弃不必要的维度,因此返回具有列y值的向量。

还有subset命令,如果您知道所需的列,则非常有用:

df <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df <- subset(df, select = c(a, c))

@hadley 发表评论后更新:要删除列 a,c,您可以执行以下操作:

df <- subset(df, select = -c(a, c))
within(df, rm(x))

可能是最简单的,或多个变量:

within(df, rm(x, y))

或者,如果您正在处理data.table s(每个如何在 data.table 中按名称删除列? ):

dt[, x := NULL]   # Deletes column x by reference instantly.

dt[, !"x"]   # Selects all but x into a new data.table.

或多个变量

dt[, c("x","y") := NULL]

dt[, !c("x", "y")]