首页 > 解决方案 > 尝试在 R 中删除列,返回逻辑向量

问题描述

我有一个数据框,我需要按列名删除某些列。列名是这样生成的

drops  <- sprintf("days.7.%d",1:7)

我的数据框是df,我想删除生成的列,这就是我尝试过的。

dfnew <- df[,(!names(df) %in% drops)]

它再次返回一个逻辑向量而不是数据帧。

我也尝试了这些方法,但每次它返回相同的逻辑向量

  dropnames<- names(df) %in% drops
  dfnew <- df[!dropnames]

  dfnew <- df[ , -which(names(df) %in% drops)]

标签: rdataframedynamic-columns

解决方案


你可能有data.table. 看这个例子

df <- mtcars[, 1:9]
names(df)[1:7] <- drops
df[,(!names(df) %in% drops)] #works

#                    vs am
#Mazda RX4            0  1
#Mazda RX4 Wag        0  1
#Datsun 710           1  1
#Hornet 4 Drive       1  0
#Hornet Sportabout    0  0
#...

现在将其转换为data.table

library(data.table)
setDT(df)

并尝试同样的事情

df[,(!names(df) %in% drops)] #you get
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE

要按data.table名称进行子集化,您可以这样做

df[, setdiff(names(df), drops), with = FALSE]

#    vs am
# 1:  0  1
# 2:  0  1
# 3:  1  1
# 4:  1  0
# 5:  0  0
# 6:  1  0
#...

推荐阅读