DF <- data.frame(one=c('a','b'), two=c('c', 'd'), three=c('e', 'f'), four=c('g', 'h'))
DF
# one two three four
#1 a d f i
#2 b e g j
DF[which(names(DF) %in% c('two','three')) *-1]
# one four
#1 a g
#2 b h
library(dplyr)
starwars %>%
select(-(name:mass)) %>% # the range of columns from 'name' to 'mass'
select(-contains('color')) %>% # any column name that contains 'color'
select(-starts_with('bi')) %>% # any column name that starts with 'bi'
select(-ends_with('er')) %>% # any column name that ends with 'er'
select(-matches('^f.+s$')) %>% # any column name matching the regex pattern
select_if(~!is.list(.)) %>% # not by column name but by data type
head(2)
# A tibble: 2 x 2
homeworld species
<chr> <chr>
1 Tatooine Human
2 Tatooine Droid
del <- c('a','b')
DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, (del) := NULL]
DT <- <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, {del} := NULL]
# force or `c` would also work.
你也可以使用 set ,这可以避免 [.data.table , and also works for data.frames! 的开销
df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# drop `a` from df (no copying involved)
set(df, j = 'a', value = NULL)
# drop `b` from DT (no copying involved)
set(DT, j = 'b', value = NULL)
19 回答
这是一个
dplyr
方式:我喜欢这个,因为没有注释就可以直观地阅读和理解,并且可以在数据框中更改位置 . 它还遵循使用
-
去除元素的矢量化习语 .使用
which
查找要删除的列的索引 . 给这些索引一个负号(*-1
) . 然后对这些值进行子集化,这将从数据帧中删除它们 . 这是一个例子 .出于兴趣,这标志着R的奇怪的多语法不一致之一 . 例如,给定一个两列数据框:
这给出了一个数据框
但这给了一个矢量
这在
?[
中都有解释,但并不是完全预期的行为 . 好吧,至少不是我...另一个
dplyr
回答 . 如果您的变量有一些共同的命名结构,您可以尝试starts_with()
. 例如如果要在数据框中删除一系列变量,可以使用
:
. 例如,如果你想删除var2
,var3
和其间的所有变量,你只需要留下var1
:另一种解决方案,如果您不想使用上面的@ hadley:如果“COLUMN_NAME”是您要删除的列的名称:
可能是最简单的,或多个变量:
或者如果你正在处理
data.table
s(每How do you delete a column by name in data.table?):或多个变量
在
data.table
(installation instructions)的开发版本中,不再需要with = FALSE
:还有
subset
命令,如果您知道所需的列,则非常有用:@hadley评论后更新:要删除列a,c,您可以执行以下操作:
我一直认为必须有一个更好的习语,但是为了按名称减去列,我倾向于做以下事情:
您可以像这样使用
%in%
:除了
select(-one_of(drop_col_names))
在前面的答案中演示之外,还有一些dplyr
选项用于使用select()
删除列,这些选项不涉及定义所有特定的列名称(使用dplyr starwars样本数据用于列名中的某些变体):Output:
Output:
提供 data frame 和 comma separated names 字符串以删除:
Usage :
基于grep()将返回数字向量这一事实,可能有更强大的策略 . 如果你在我的一个数据集中有一长串变量,那么一些变量以“.A”结尾,而另一些以“.B”结尾,你只想要以“.A”结尾的变量(沿着如果所有变量都不匹配任何模式,请执行以下操作:
对于手头的情况,使用Joris Meys示例,它可能不那么紧凑,但它将是:
list(NULL)也有效:
另一种可能性
要么
在Bernd Bischl的
BBmisc
包中有一个名为dropNamed()
的函数就是这样做的 .优点是它避免重复数据框参数,因此适用于
magrittr
中的管道(就像dplyr
方法一样):Dplyr Solution
我怀疑这会引起很多关注,但是如果你有一个要删除的列列表,并且你想在
dplyr
链中执行它,我在select
子句中使用one_of()
:这是一个简单,可重复的示例:
可以通过运行
?one_of
或此处找到文档:http://genomicsclass.github.io/book/pages/dplyr_tutorial.html
您可以使用简单的名称列表:
或者,您也可以列出要保留的列表并按名称引用它们:
编辑:对于那些仍然不熟悉索引函数的
drop
参数的人,如果要将一列保留为数据框,则执行以下操作:drop=TRUE
(或不提及它)将丢弃不必要的维度,因此返回具有列y
的值的向量 .如果要通过引用删除列并避免与
data.frames
关联的内部复制,则可以使用data.table
包和函数:=
您可以将字符向量名称传递到
:=
运算符的左侧,将NULL
作为RHS传递 .如果要将名称预定义为字符向量在调用
[
之外,在()
或{}
中包装对象的名称,以强制在调用范围内评估LHS,而不是在DT
范围内的名称 .你也可以使用
set
,这可以避免[.data.table
, and also works for data.frames! 的开销