我有一个包含300列数据的数据框。 我创建了一个包含126个元素的向量,这些元素是300个中126个的列名。 我想基于不在我的126中来对300进行子集化。它们不是有序的,所以我不能简单地通过指定-1:-126来删除。
我尝试使用grep和matrix操作进行各种操作,但它们没有用。如下面哪些不起作用。 x有300列。 f包含我想从x1中排除的126个列名的向量。
x1<-x[,-which(names(x), %in% f)]
如果我明确地使用了一个或多个变量名,我可以让它工作,但我不想在f中输入126个元素。
答案 0 :(得分:7)
使用<div class="a"></div>
<div class="b"></div>
<div class='log'></div>
:
%in%
然后names.use <- names(df)[!(names(df) %in% f)]
将包含名称names.use
向量中包含 not 的所有列的名称。
要使用所需的列对数据框进行子集化,可以使用以下命令:
f
答案 1 :(得分:6)
这是一个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]
答案 2 :(得分:4)
你也可以这样做:
subset(x, select=f)
与在%中使用%不同,如果 f 中的某个值不是 x 中的列名,则会引发错误,这有助于发现拼写错误如果您已手动输入其中一些。
答案 3 :(得分:1)
感谢所有人如此迅速地回答。您的几个解决方案都有效。我意识到我遇到的最大问题是我没有真正的矢量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!
发布的许多想法都奏效了。我只是遇到了一个问题,我的选择标准不是一个合适的向量,并且有一些与之相关的因素问题。