【问题标题】:Delete multiple columns by reference using reverse selection in data.Table [duplicate]在data.Table中使用反向选择通过引用删除多列[重复]
【发布时间】:2017-07-12 10:06:28
【问题描述】:

我想使用引用删除不在列表中的列。

library("data.table")
df <- data.frame("ID"=1:10,"A"=1:10,"B"=1:10,"C"=1:10,"D"=1:10)
setDT(df,key="ID")
list_to_keep <- c("ID","A","B","C")
df[,!names(df)%in%list_to_keep,with=FALSE]

给我一​​个我想要删除的列的选择,但是当我这样做时:

df <- data.frame("ID"=1:10,"A"=1:10,"B"=1:10,"C"=1:10,"D"=1:10)
setDT(df,key="ID")
list_to_keep <- c("ID","A","B","C")
df[,!names(df)%in%list_to_keep:=NULL,with=FALSE]

我收到LHS of := isn't a column names ('character' or positions ('integer' or 'numeric')。这样做的正确方法是什么?

【问题讨论】:

  • 不确定data.table,但在基础R 中,您需要使用which(!names(df)%in%list_to_keep)。现在你只得到一个布尔向量,你需要一个位置向量。
  • @Kenji,为什么:=NULL 排队df[,!names(df)%in%list_to_keep:=NULL,with=FALSE] ?
  • @ParthChaudhary 我不想复制数据表,因此:=NULL 通过引用而不是赋值删除
  • @Kenji,好的,由于DT的使用,请通过引用删除
  • 我看不出它怎么可能与另一个问题重复。虽然另一个问题的部分答案可能会解决我的问题,但问题本身在以下方面有所不同:1)它没有专门要求通过引用删除列。 2)它没有专门要求反向选择。另一个问题的主要答案类似于df &lt;- df[list_to_keep],它根本没有回答我的问题。

标签: r data.table


【解决方案1】:

我们可以使用setdiff获取数据集中不在list_to_keep中的names并将其分配(:=)给NULL

df[, setdiff(names(df), list_to_keep) := NULL]

正如@rosscova 提到的,在逻辑vector 上使用which 可用于获取列的位置并将列分配给NULL

df[, which(!names(df)%in%list_to_keep):=NULL] 

【讨论】:

  • 也可以传递整数向量,所以df[,which(!names(df)%in%list_to_keep):=NULL] 也可以。
【解决方案2】:

:= 中的LHS 是“列名(或数字位置)的字符向量或这样计算的变量。”

!names(df)%in%list_to_keep 是逻辑向量。

所以,

df[,names(df)[!names(df)%in%list_to_keep]:=NULL]

会起作用。

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 2015-02-05
    • 1970-01-01
    • 2012-11-03
    • 2013-01-06
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多