问题 根据Vector R选择列的子集


我有一个包含300列数据的数据框。 我创建了一个包含126个元素的向量,这些元素是300个中126个的列名。 我希望基于不在我的126中来对300进行子集化。它们不是有序的,所以我不能简单地通过指定-1:-126来删除。

我用grep和matrix操作尝试了各种各样的东西,但它们没有用。如下面哪些都行不通。 x有300列。 f包含我想从x1中排除的126个列名的向量。

x1<-x[,-which(names(x), %in% f)]

如果我明确地使用一个或多个变量名称,我可以让它工作,但我不想在f中输入126个元素。


1478
2018-05-06 12:47


起源

为了进一步说明,我希望能够使用f中的元素,就像我指定了f = c(element1of_f,element2of_f,...,element126of_f) - akaDrHouse
x[, !names(x) %in% f]? - Sotos
你是否使用带有参数的dplyr中的select:start_with,end_with,contains ...? - Dimitri Petrenko
x%>%select(-f) - > x1应该适用于您的示例 - Dimitri Petrenko


答案:


使用 %in%

names.use <- names(df)[!(names(df) %in% f)]

然后 names.use 将包含所有列的名称  包含在你的名字矢量中 f

要使用所需的列对数据框进行子集化,可以使用以下命令:

df.subset <- df[, names.use]

5
2018-05-06 12:52



我尝试了这个,它选择了其他名称,但没有选择数据。它定义了一个我想要的带有colnames的向量,但没有数据。 - akaDrHouse
只需使用所需的列对原始数据框进行子集化。 - Tim Biegeleisen


这里有一个 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]

3
2018-05-06 13:08



很酷@ rafa.pereira,刚刚用过你的解决方案 - LucasMation


你也可以这样做:

subset(x, select=f)

与在%中使用%不同,如果其中一个值,则会抛出错误 F 不是列名 X,如果你手动输入了一些拼写错误,这可能有助于发现拼写错误。


3
2017-11-29 20:40





感谢所有人如此迅速地回答。你的几个解决方案都有效。我意识到我遇到的最大问题是我没有真正的矢量f!一旦我做了,它仍然被视为一个因素!所以我想我会发布我的帮助来解决它。

f <- select(filter(hash_t,(variable %in% c("a",...,"z"))),X) #wasn't a vector...
f[,1]<-sapply(f[,1],as.character) # had to remove factor info from f; still not a vector...
f<-f[,1] # Now I had a vector!
x1<-x[,!names(x) %in$ f]  #worked!

发布的许多想法都奏效了。我的选择标准不是一个合适的载体,并且有一些与之相关的因素问题。


1
2018-05-06 13:23



有几种解决方案有效吗?除了你的答案,只有两个答案。一般来说,当您提出问题时,您应该将答案标记为正确。如果没有人真正回答你的问题那么你就不会标记,但是标记会使你的问题对于有类似问题的其他人更有价值。 - Tim Biegeleisen
好吧,索托的评论是第一个,也是正确的,简单的......但没有张贴作为答案。您的修改后的答案以及Rafael都有效。我无法让这些方法最初工作的原因是我错误地构造了一个向量子集的向量。这就是我发布答案的原因;帮助可能有类似问题的其他人。我认为将自己的答案标记为正确有点夸张......它不会让我;我刚试过:) - akaDrHouse