【问题标题】:dplyr: select by name and value at the same timedplyr:同时按名称和值选择
【发布时间】:2019-04-09 14:40:09
【问题描述】:

(这个问题可能是重复的,但我找不到它被问到......)

使用dplyr 技术,如何同时通过名称和值从data.frame 中选择列?例如以下(不起作用):

> data.frame(x=4, y=6, z=3) %>%
    select_if(matches('x') | mean(.) > 5)
Error: No tidyselect variables were registered

在基础 R 中,我会这样做:

> df <- data.frame(x=4, y=6, z=3)
> df[names(df) == 'x' | colMeans(df) > 5]
  x y
1 4 6

【问题讨论】:

  • 感谢@RonakShah,这确实看起来非常接近,尽管我的问题是一个更提炼/抽象的版本,而在另一个问题中,他们从来没有像 Andrew 那样得到一个干净利落的答案。跨度>

标签: r select dplyr


【解决方案1】:

更新:使用dplyr v1.0.0:

data.frame(x=4, y=6, z=3) %>%
      select(matches("x"), where(~mean(.) > 5))

原答案: 您可以使用带逗号的select 和colMeans

data.frame(x=4, y=6, z=3) %>%
  select(matches("x"), which(colMeans(.) > 5))
  x y
1 4 6

【讨论】:

  • 不错!我什至没有想过要那样尝试。直接去bind_cols :)
  • 酷,我不知道(或忘记)我们可以在select 子句中执行which(colMeans(.) &gt; 5)。如果我们可以摆脱which,那就太好了,我想知道为什么不允许与列数长度相同的逻辑向量。
【解决方案2】:

我们可以使用select_if 来根据条件提取列名,并在select 中用于匹配“x”的列名

data.frame(x=4, y=6, z=3) %>% 
     select(matches("x"), names(select_if(., ~ mean(.x) > 5)))
#  x y
#1 4 6

注意:这里我们使用select_if,因为 OP 想要一个专门的答案。否则,可以通过许多其他方式完成

【讨论】:

  • 谢谢。我并不是专门寻找一种使用select_if 的方法,只是一般地寻找dplyr 技术。
  • @KenWilliams colMeans 技术是 base R。 base R 只是对您的原始代码稍作改动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 2023-01-31
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
相关资源
最近更新 更多