根据Vector R选择列的子集

时间:2016-05-06 12:47:24

标签: 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个元素。

4 个答案:

答案 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!

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