R按标签引用dataframe列以删除它们

R按标签引用dataframe列以删除它们,r,dataframe,subset,R,Dataframe,Subset,我想这是一个很简单的问题,虽然我的搜索结果很差-- 给定 细分操作 z[,c('X.39','X.51')] 工作。但是 z[,-c('X.39','X.51')] 给我 Error in -c("X.39", "X.51") : invalid argument to unary operator 为什么会这样?如何使用列名列表删除一组列 编辑 我知道我可以随时使用 z[,!names(z) %in% c('X.39','X.51')] 但我正在寻找一个更懒惰的解决方案 编辑2 大部分

我想这是一个很简单的问题,虽然我的搜索结果很差--

给定

细分操作

z[,c('X.39','X.51')]
工作。但是

z[,-c('X.39','X.51')]
给我

Error in -c("X.39", "X.51") : invalid argument to unary operator
为什么会这样?如何使用列名列表删除一组列

编辑

我知道我可以随时使用

z[,!names(z) %in% c('X.39','X.51')]
但我正在寻找一个更懒惰的解决方案

编辑2


大部分的讨论都在评论部分,但为了保持良好的秩序,结束这一讨论的要点是,不可能有更懒惰的解决方案(直接引用名称)。这似乎是在中设计的。

您可以使用setdiff函数,但我不能说这是否是最优雅的解决方案:

z[, setdiff(names(z), c('X.39','X.51'))]

在%c('X.39,'X.51')中使用
z[,!names(z)%drop=FALSE]
drop=FALSE
用于确保返回
data.frame
,即使子集设置后的结果只有一列。默认情况下,如果结果为1列,则返回一个向量。
-如图所示,不建议使用该向量。
。也可能使用此向量:此向量:(尽管存在子集,但此处的答案有效)@TahnoonPasha,try:
df
z[, setdiff(names(z), c('X.39','X.51'))]