【问题标题】:Using a loop in R to calculate the frequency of a specific outcome for multiple columns使用 R 中的循环来计算多列的特定结果的频率
【发布时间】:2023-04-01 12:16:01
【问题描述】:

我有一个数据集,我需要在其中计算对一系列问题回答“是”的受访者百分比,忽略未回答问题的受访者。每个问题由两个子问题组成 - 受访者在过去一个月内是否做过某事,以及他们在过去一年内是否做过。

数据集看起来像这样。在此示例中,受访者表示他们在过去一年和上个月是否吃过特定类型的甜点:

df <- read.table(text = "1 yes yes yes yes yes yes
                 2 no yes unknown unknown no no
                 3 no no no yes no yes
                 4 unknown unknown no yes yes yes",
                 header = F)

colnames(df) <- c("id", "ice cream - past month", "ice cream - past year",
                  "chocolate - past month", "chocolate - past year",
                  "cookies - past month", "cookies - past year")

我想创建一个表格,汇总每个问题回答“是”(忽略“未知数”)的受访者百分比,生成一个如下所示的表格。

Dessert Past month Past year
Ice Cream 33.3% 66.6%
Chocolate 33.3% 100.0%
Cookies 50.0% 75.0%

我创建的解决方法是创建一个小表格,其中包含对每个变量回答“是”的受访者百分比。

该代码的示例如下:

icecream.month <- df %>%
  filter(`ice cream - past month` == "yes" | `ice cream - past month` == "no") %>%
  tabyl(`ice cream - past month`) %>%
  adorn_totals("row") %>%
  adorn_pct_formatting(rounding = "half up", digits = 1) %>%
  select(-c("n")) %>%
  rename("past month" = "percent") %>%
  rename("ice cream" = "ice cream - past month") %>%
  subset(`ice cream` == "yes")

我基本上会为每个甜点和每个时间段重复此代码。然后使用“bind_rows”和“full_join”参数将所有值合并到一个表中。

如您所见,这非常笨拙。我对循环非常很陌生,但我怀疑有一种方法可以非常简单地使用循环来做到这一点。任何建议都将不胜感激!

谢谢

【问题讨论】:

    标签: r loops dplyr


    【解决方案1】:

    不需要循环 - 这就是你所追求的吗?

    df %>% 
        tidyr::pivot_longer(-id) %>% 
        tidyr::separate(name, sep=" - ", into = c("food", "time")) %>% 
        dplyr::group_by(food, time) %>% 
        dplyr::filter(value != "unknown") %>% 
        dplyr::summarise(a = sum(value == "yes") / n() * 100) %>% 
        tidyr::pivot_wider(names_from="time", values_from="a")
    
    # A tibble: 3 x 3
    # Groups:   food [3]
      food      `past month` `past year`
      <chr>            <dbl>       <dbl>
    1 chocolate         33.3       100  
    2 cookies           50          75  
    3 ice cream         33.3        66.7
    

    【讨论】:

    • 这完美!我非常喜欢使用循环,我什至没有考虑到这一点。谢谢你:)
    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多