【问题标题】:Curly curly operator inside survey function调查功能内的卷曲运算符
【发布时间】:2022-01-07 21:56:07
【问题描述】:

我有一个带有权重列的调查数据,例如这个虚拟样本:

df <- structure(
  list(
    device = c(
      "Digital",
      "No Device",
      "No Device",
      "Digital",
      "Digital",
      "No Device",
      "Digital",
      "Digital",
      "Analouge",
      "Digital"
    ),
    sex = structure(c(1, 2, 2, 1, 1, 1, 1, 2, 2, 1), format.spss = "F8.2"),
    region = structure(c(15, 3, 18, 18, 30, 18, 54, 50, 30,
                         38), format.spss = "F8.0"),
    age_group = structure(c(3, 3,
                            5, 7, 6, 4, 7, 7, 6, 7), format.spss = "F8.2"),
    weight = structure(
      c(
        845.674012066483,
        523.065753702848,
        551.805833394951,
        454.282517089281,
        1234.09384828581,
        1046.04985735983,
        994.717870661103,
        1013.62211131793,
        1307.98181670913,
        544.360713556522
      ),
      format.spss = "F8.2"
    )
  ),
  row.names = c(NA,
                -10L),
  class = c("tbl_df", "tbl", "data.frame")
)

我正在使用 srvyr 包制作调查对象并进行分析:

library(srvyr)
sv_sample <- df %>%
  srvyr::as_survey_design(weights = weight)

例如,我在这里进行设备和性别之间的交叉表交互,没关系

sv_sample %>% 
  mutate(sex = as.factor(sex) )%>%
  mutate_at(vars(device),
            fct_explicit_na,
            na_level = "to_impute") %>%
  group_by(sex ,device) %>%
  summarize(
    proportion = srvyr::survey_mean(na.rm = TRUE),
    total = srvyr::survey_total(na.rm = TRUE)
  ) %>%
  select(-proportion_se, -total_se) %>%
  ungroup()

输出:

# A tibble: 5 x 4
  sex   device    proportion total
  <fct> <fct>          <dbl> <dbl>
1 1     Digital        0.796 4073.
2 1     No Device      0.204 1046.
3 2     Analouge       0.385 1308.
4 2     Digital        0.298 1014.
5 2     No Device      0.316 1075.

我需要在我的数据中为 device 和其他演示变量创建类似的交叉表,例如 age 、 region 、 family_size 等,所以我尝试使用 Curly curly 制作一个函数,而不是多次复制和粘贴交叉表 sn-p操作员。我在这里错过了什么?

    crosstab <- function(survey_data, vars1 , vars2) {
      mutate(demo = as.factor{{ vars1 }} )%>%
        mutate_at(vars{{ vars2 }},
                  fct_explicit_na,
                  na_level = "to_impute") %>%
        group_by(demo ,{{ vars2 }}) %>%
        summarize(
          proportion = srvyr::survey_mean(na.rm = TRUE),
          total = srvyr::survey_total(na.rm = TRUE) ) %>%
        select(-proportion_se, -total_se) %>%
        ungroup()
}

 crosstab(sv_sample, sex ,device)

【问题讨论】:

    标签: r survey rlang tidyeval


    【解决方案1】:

    两件事:

    1. vars{{ vars2 }} 是无效语法。 vars 是一个函数:vars({{vars2}})as.factor 也一样。

    2. {{…}} 插入一个 single 值。如果你想传递多个值,你要么需要将!!!enquos 结合使用,要么只传递点中的变量(即...),无需元编程。

      但是,在您的情况下,您似乎实际上只传递了一个变量名称,因此将 vars1vars2 重命名为 var1var1 可能更合适——或者,更好然而,给他们正确的名称:var1 是一个不具描述性的、神秘的变量名。

    除了mutate_at(vars(...), f),还可以考虑使用其现代替代品mutate(across(..., f));这进一步简化了您的代码。见Taking multiple columns without ...

    【讨论】:

    • 我没有完全理解你的第二点。你的意思是重命名还是我仍然需要使用{{…}}function(survey_data, demo1 , demo2) { mutate(demo = as.factor vars({{demo1}}) )%&gt;% mutate_at(vars({{demo2}}), fct_explicit_na, na_level = "to_impute") %&gt;% group_by(demo1 ,{{demo2}}) %&gt;% summarize( proportion = srvyr::survey_mean(na.rm = TRUE), total = srvyr::survey_total(na.rm = TRUE) ) %&gt;% select(-proportion_se, -total_se) %&gt;% ungroup()
    • @DanG 好吧,使用demo1 代替vars1 并没有改进变量名。无论哪种方式,第二点仅适用于您尝试将多个名称传递给vars1vars2,在这种情况下您的代码将无法工作。如果您只传递单个名称,则该代码很好(但您仍然应该找到更具描述性的变量名称)。
    • 你好康拉德。 enexprs() 仅供专家使用。我们更新了 rlang 文档以使其更清晰。你能在这篇文章中提到enquos()吗?谢谢 :) 更好的是,从一个 {{ var 到多个的标准方法是将选择传递给 across(),这样就不需要元编程。
    • @LionelHenry 新的“rlang”文档做得很好,看起来很不错!
    猜你喜欢
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2020-10-17
    • 2017-03-27
    • 2022-01-21
    • 2021-10-29
    相关资源
    最近更新 更多