【问题标题】:Select Subset of Columns based on Vector R基于向量 R 选择列的子集
【发布时间】:2016-05-06 12:47:23
【问题描述】:

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

我用 grep 和矩阵运算尝试了各种方法,但没有奏效。比如下面这行不通。 x 有 300 列。 f 包含我想从 x1 中排除的 126 个列名的向量。

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

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

【问题讨论】:

  • 为了进一步说明,我希望能够像指定 f=c(element1of_f, element2of_f, ... , element126of_f) 一样使用 f 中的元素
  • x[, !names(x) %in% f]?
  • 您是否使用了来自 dplyr 的选择和参数:start_with、end_with、包含...?
  • x%>% select(-f) -> x1 应该适用于您的示例

标签: r


【解决方案1】:

使用%in%:

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

然后names.use 将包含所有列的名称,这些列包含在您的名称向量f 中。

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

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

【讨论】:

  • 我试过了,它选择了其他名称,但没有选择数据。它定义了一个带有我想要的列名的向量,但没有数据。
  • 使用您想要的列对原始数据框进行子集化。
【解决方案2】:

你也可以这样做:

subset(x, select=f)

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      感谢大家这么快回答。您的几个解决方案有效。我意识到我遇到的最大问题是我没有一个真正的向量 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!
      

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

      【讨论】:

      • 几个解决方案有效?除了你的答案,只有两个答案。一般来说,当您提出问题时,您应该将答案标记为正确。如果没有人真正回答您的问题,那么您就不会标记,但标记会使您的问题对其他有类似问题的人更有价值。
      • 好吧,Soto 的评论首先是正确的,而且是最简单的……但没有作为答案发布。您修改后的答案和拉斐尔的答案都有效。我最初无法使这些方法起作用的原因是我错误地构造了一个向量子集。这就是我发布答案的原因;帮助其他可能有类似问题的人。我认为将我自己的答案标记为正确有点炫耀......而且它不会让我;我刚试过:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多