尝试删除 R 中的列,返回逻辑向量
Try to drop columns in R,returning logical vector
我有一个数据框,我需要在其中按列名删除某些列。列名是这样生成的
drops <- sprintf("days.7.%d",1:7)
我的数据框是 df
,我想删除生成的列,这是我尝试过的。
dfnew <- df[,(!names(df) %in% drops)]
它再次返回一个逻辑向量而不是数据帧。
我也试过这些方法,但每次都是returns相同的逻辑向量
dropnames<- names(df) %in% drops
dfnew <- df[!dropnames]
dfnew <- df[ , -which(names(df) %in% drops)]
你可能 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
#...
我有一个数据框,我需要在其中按列名删除某些列。列名是这样生成的
drops <- sprintf("days.7.%d",1:7)
我的数据框是 df
,我想删除生成的列,这是我尝试过的。
dfnew <- df[,(!names(df) %in% drops)]
它再次返回一个逻辑向量而不是数据帧。
我也试过这些方法,但每次都是returns相同的逻辑向量
dropnames<- names(df) %in% drops
dfnew <- df[!dropnames]
dfnew <- df[ , -which(names(df) %in% drops)]
你可能 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
#...