【问题标题】:dplyr r : selecting columns whose names are in an external vector [duplicate]dplyr r:选择名称在外部向量中的列[重复]
【发布时间】:2021-10-15 08:33:32
【问题描述】:

目的

我可以使用dplyr 选择列,条件是列名在外部向量中。我找到了一些解释如何使用名称向量对数据框进行子集化的帖子,但是当向量中的某些名称在数据框中不存在时,我找不到。

示例数据集

  library(tidyverse)
  library(tibble)
  library(data.table)
  
  col_names <- c('a', 'b', 'e')
  
  rename <- dplyr::rename
  select <- dplyr::select
  
  set.seed(10002)
  a <- sample(1:20, 1000, replace=T)
  
  set.seed(10003)
  b <- sample(letters, 1000, replace=T)
  
  set.seed(10004)
  c <- sample(letters, 1000, replace=T)
  
  
  data <-   
    data.frame(a, b, c) 
# I would like to choose a, b that are in col_names vector. 

【问题讨论】:

标签: r select dplyr conditional-statements


【解决方案1】:

我们可以使用any_ofselect

library(dplyr)
data %>%
     select(any_of(col_names))

-输出

 a b
1  1 e
2  4 e
3 13 f
4  8 m
5 10 z
6  3 y
...

【讨论】:

  • 谢谢@akrun!根据我的理解,这需要知道col_names 中没有哪些列。正确的?有没有什么办法我们自动检测到,比如select_if?
  • 另外,我不确定我是否理解了解决方案。我的目标是取出a,b,没有c作为输出。您的输出显示原始数据框的所有列。我在这里错过了什么吗?
  • @J.K.对不起,现在我明白你的意思了。我更新了。我在想你需要从向量创建一个 data.frame 构造
【解决方案2】:

这是解决问题的一种方法:

data[names(data) %in% col_names]

#    a b
# 1  1 e
# 2  4 e
# 3 13 f
# 4  8 m
# 5 10 z
# 6  3 y
# ...

【讨论】:

  • 非常感谢您给我另一个选择!!!它的效果也很棒!
【解决方案3】:

我们也可以使用matches:

library(dplyr)
data %>% 
  select(matches(col_names)))

输出:

       a b    
   <int> <chr>
 1     1 e    
 2     4 e    
 3    13 f    
 4     8 m    
 5    10 z    
 6     3 y    
 7    19 g    
 8     7 f    
 9    12 f    
10    15 k    
# … with 990 more rows

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 2016-01-11
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多