按两个因素对观察结果进行分组后计算单独的百分比

问题描述 投票:0回答:1

我使用“group_by”和两个因素对数据集进行了分组,并计算了每个结果组属于每个感兴趣类别的观察数量,如下所示。

df1 <- data.frame(x = c(a,a,b,a,b,c,a,c,a,b), y = c(0,1,0,1,1,0,1,0,0,0,0), var = c(inf, med, inf, sup, med, med, sup, inf, med, sup))

df1 %>% 
  group_by(x,y) %>% 
  count(var) -> conta_var

# A tibble: 9 × 4
# Groups:   x, y [5]
  x         y var       n
  <chr> <dbl> <chr> <int>
1 a         0 inf       1
2 a         0 med       1
3 a         1 med       1
4 a         1 sup       2
5 b         0 inf       1
6 b         0 sup       1
7 b         1 med       1
8 c         0 inf       1
9 c         0 med       1

现在我想添加一个名为 n_perc 的新列,它采用每个 n 并将其除以 x-y 的每个组合的观察总数

我可以通过首先通过过滤每个组来计算每个 n 来手动完成:

df1 %>% 
  filter(x == "a", y = 1) %>% 
  nrow() -> n_f

然后使用带有嵌套 ifelse 函数的 mutate 添加列,但我相信有一种更快的方法来做到这一点。

最终结果如下:

# A tibble: 9 × 4
# Groups:   x, y [5]
  x         y var       n   n_perc
  <chr> <dbl> <chr> <int>    <dbl>
1 a         0 inf       1      0.5
2 a         0 med       1      0.5
3 a         1 med       1      0.33
4 a         1 sup       2      0.66
5 b         0 inf       1   ...
6 b         0 sup       1
7 b         1 med       1
8 c         0 inf       1
9 c         0 med       1
r if-statement dplyr group-by
1个回答
0
投票

这是一个包含示例数据帧的更正版本的代表。它将您的值舍入为 2dp,但请注意 n_perc 的第四个值舍入为 0.67,而不是您的示例输出中的 0.66:

library(dplyr)

# Your corrected dataframe
df1 <- data.frame(x = c("a","a","b","a","b","c","a","c","a","b"),
                  y = c(0,1,0,1,1,0,1,0,0,0),
                  var = c("inf", "med", "inf", "sup", "med",
                          "med", "sup", "inf", "med", "sup"))

conta_var <- df1 %>% 
  group_by(x, y) %>% 
  count(var) %>%
  mutate(n_perc = signif(n / sum(n), 2)) %>%
  ungroup()

conta_var
# A tibble: 9 × 5
  x         y var       n n_perc
  <chr> <dbl> <chr> <int>  <dbl>
1 a         0 inf       1   0.5 
2 a         0 med       1   0.5 
3 a         1 med       1   0.33
4 a         1 sup       2   0.67
5 b         0 inf       1   0.5 
6 b         0 sup       1   0.5 
7 b         1 med       1   1   
8 c         0 inf       1   0.5 
9 c         0 med       1   0.5
© www.soinside.com 2019 - 2024. All rights reserved.