我有一个包含300列数据的数据框.我创建了一个包含126个元素的向量,这些元素是300个中126个的列名.我想基于不在我的126中来对300进行子集化.它们不是有序的,所以我不能简单地通过指定-1来删除: -126.
我用grep和matrix操作尝试了各种各样的东西,但它们没有用.如下面哪些不起作用.x有300列.f包含我想从x1中排除的126个列名的向量.
x1<-x[,-which(names(x), %in% f)]
Run Code Online (Sandbox Code Playgroud)
如果我明确地使用一个或多个变量名称,我可以让它工作,但我不想在f中输入126个元素.
Tim*_*sen 11
用途%in%
:
names.use <- names(df)[!(names(df) %in% f)]
Run Code Online (Sandbox Code Playgroud)
然后names.use
将包含名称向量中未包含的所有列的名称f
.
要使用所需的列对数据框进行子集化,可以使用以下命令:
df.subset <- df[, names.use]
Run Code Online (Sandbox Code Playgroud)
这是一个data.table
具有可重复示例的解决方案.
# load library
library(datat.table)
# get data
data(iris)
# convert your dataset into data.table
setDT(iris)
# vector of columns you DON'T want
f <- c("Sepal.Width","Petal.Length")
# subset
output <- iris[, !f, with = FALSE]
Run Code Online (Sandbox Code Playgroud)
小智 6
有点晚了,但这可以帮助其他人 - 一种完成此任务的干净方法dplyr
:
library(tidyverse)
library(tidyselect)
df %>%
select(all_of(names(f)))
Run Code Online (Sandbox Code Playgroud)
一些可重现的示例 - 1) 从向量中的名称进行子集化:
dplyr::starwars
f <- c("name","eye_color","gender")
starwars %>%
select(all_of(f))
Run Code Online (Sandbox Code Playgroud)
2)从另一个数据框的列名进行子集化:
df <- data.frame(letters = c("a","b","c","d"),
numbers = 5:8,
fruits = c("apple","grape","lemon","orange"),
animals = c("frog","cat","fish","lizard"))
df2 <- data.frame(letters = c("l","m","n","o"),
numbers = 13:16)
df %>%
select(all_of(names(df2)))
Run Code Online (Sandbox Code Playgroud)
从包中查看all_of( )
和功能。我很确定会自动导入它们,但我经常加载该包以防万一。any_of( )
tidyselect
dplyr
您也可以:
subset(x, select=f)
Run Code Online (Sandbox Code Playgroud)
与使用%in%不同,如果f中的值之一不是x中的列名,这将引发错误,如果您手动键入了一些错字,这将有助于发现错别字。