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