首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >dplyr::select()是否包含数据框中可能不存在的某些变量?

dplyr::select()是否包含数据框中可能不存在的某些变量?
EN

Stack Overflow用户
提问于 2018-07-26 08:08:52
回答 2查看 2.9K关注 0票数 18

我有一个助手函数(比如foo()),它将在各种数据帧上运行,这些数据帧可能包含也可能不包含指定的变量。假设我有

代码语言:javascript
复制
library(dplyr)
d1 <- data_frame(taxon=1,model=2,z=3)
d2 <- data_frame(taxon=2,pss=4,z=3)

我想要选择的变量是

代码语言:javascript
复制
vars <- intersect(names(data),c("taxon","model","z"))

也就是说,我希望foo(d1)返回taxonmodelz列,而foo(d2)只返回taxonz

如果foo包含select(data,c(taxon,model,z)),那么foo(d2)将失败(因为d2不包含model)。如果我使用select(data,-pss),那么foo(d1)也同样会失败。

如果我退出了tidyverse (只返回data[vars]),我知道如何做到这一点,但我想知道是否有一种方便的方法(1)使用某种select()帮助器(tidyselect::select_helpers)或(2)使用tidyeval (我还没有找到时间思考!)

EN

回答 2

Stack Overflow用户

发布于 2018-07-26 08:18:32

您可以使用one_of(),它会在缺少列时发出警告,但在其他情况下会选择正确的列:

代码语言:javascript
复制
d1 %>%
    select(one_of(c("taxon", "model", "z")))
d2 %>%
    select(one_of(c("taxon", "model", "z")))
票数 7
EN

Stack Overflow用户

发布于 2018-07-26 08:44:40

在示例中使用内置anscombe数据框,请注意z不是anscombe中的列:

代码语言:javascript
复制
anscombe %>% select(intersect(names(.), c("x1", "y1", "z")))

给予:

代码语言:javascript
复制
   x1    y1
1  10  8.04
2   8  6.95
3  13  7.58
4   9  8.81
5  11  8.33
6  14  9.96
7   6  7.24
8   4  4.26
9  12 10.84
10  7  4.82
11  5  5.68
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51529294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档