根据Vector R选择列的子集

aka*_*use 17 r

我有一个包含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)


raf*_*ira 7

这是一个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)

  • 酷@ rafa.pereira,只用了您的解决方案 (2认同)

小智 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( )tidyselectdplyr


kro*_*ock 5

您也可以:

subset(x, select=f)
Run Code Online (Sandbox Code Playgroud)

与使用%in%不同,如果f中的值之一不是x中的列名,这将引发错误,如果您手动键入了一些错字,这将有助于发现错别字。