R中每组模式值的百分比

hjzp0vay  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(125)

我有一个名为df的 Dataframe (如下面的dput所示):

group value
1      A     4
2      A     2
3      A     4
4      A     3
5      A     1
6      A     5
7      B     3
8      B     2
9      B     1
10     B     2
11     B     2
12     B     2

我想计算每组模式值的百分比。下面是计算每组模式值的代码:

# Mode function
mode <- function(codes){
  which.max(tabulate(codes))
}

library(dplyr)
# Calculate mode per group
df %>%
  group_by(group) %>%
  mutate(mode_value = mode(value))
#> # A tibble: 12 × 3
#> # Groups:   group [2]
#>    group value mode_value
#>    <chr> <dbl>      <int>
#>  1 A         4          4
#>  2 A         2          4
#>  3 A         4          4
#>  4 A         3          4
#>  5 A         1          4
#>  6 A         5          4
#>  7 B         3          2
#>  8 B         2          2
#>  9 B         1          2
#> 10 B         2          2
#> 11 B         2          2
#> 12 B         2          2

创建于2022年11月28日,使用reprex v2.0.2
但我不确定如何计算每组模式值的百分比,应该如下所示:

group value mode_value perc_on_mode
1      A     4          4         0.33
2      A     2          4         0.33
3      A     4          4         0.33
4      A     3          4         0.33
5      A     1          4         0.33
6      A     5          4         0.33
7      B     3          2         0.67
8      B     2          2         0.67
9      B     1          2         0.67
10     B     2          2         0.67
11     B     2          2         0.67
12     B     2          2         0.67

所以我想知道是否有人知道如何计算每组众数的百分比?
df的dput

df <- structure(list(group = c("A", "A", "A", "A", "A", "A", "B", "B", 
"B", "B", "B", "B"), value = c(4, 2, 4, 3, 1, 5, 3, 2, 1, 2, 
2, 2)), class = "data.frame", row.names = c(NA, -12L))
cbeh67ev

cbeh67ev1#

您可以尝试:

df %>%
  group_by(group) %>%
  mutate(mode_value = mode(value),
         perc_on_mode = mean(value == mode_value))

输出量:

# A tibble: 12 x 4
# Groups:   group [2]
   group value mode_value perc_on_mode
   <chr> <dbl>      <int>        <dbl>
 1 A         4          4        0.333
 2 A         2          4        0.333
 3 A         4          4        0.333
 4 A         3          4        0.333
 5 A         1          4        0.333
 6 A         5          4        0.333
 7 B         3          2        0.667
 8 B         2          2        0.667
 9 B         1          2        0.667
10 B         2          2        0.667
11 B         2          2        0.667
12 B         2          2        0.667
mhd8tkvw

mhd8tkvw2#

通过修改mode函数:

mode <- function(codes){
  tab <- tabulate(codes)
  mode_value <- which.max(tab)
  data.frame(value = codes, mode_value, perc_on_mode = tab[mode_value]/length(codes))
}

# Calculate mode per group
df %>%
  group_by(group) %>%
  do(mode(.$value))
#> # A tibble: 12 x 4
#> # Groups:   group [2]
#>    group value mode_value perc_on_mode
#>    <chr> <dbl>      <int>        <dbl>
#>  1 A         4          4        0.333
#>  2 A         2          4        0.333
#>  3 A         4          4        0.333
#>  4 A         3          4        0.333
#>  5 A         1          4        0.333
#>  6 A         5          4        0.333
#>  7 B         3          2        0.667
#>  8 B         2          2        0.667
#>  9 B         1          2        0.667
#> 10 B         2          2        0.667
#> 11 B         2          2        0.667
#> 12 B         2          2        0.667

或者用data.table表示:

library(data.table)

mode <- function(codes){
  tab <- tabulate(codes)
  mode_value <- which.max(tab)
  list(mode_value, tab[mode_value]/length(codes))
}

setDT(df)[, c("mode_value", "perc_on_mode") := mode(value), group][]
#>     group value mode_value perc_on_mode
#>  1:     A     4          4    0.3333333
#>  2:     A     2          4    0.3333333
#>  3:     A     4          4    0.3333333
#>  4:     A     3          4    0.3333333
#>  5:     A     1          4    0.3333333
#>  6:     A     5          4    0.3333333
#>  7:     B     3          2    0.6666667
#>  8:     B     2          2    0.6666667
#>  9:     B     1          2    0.6666667
#> 10:     B     2          2    0.6666667
#> 11:     B     2          2    0.6666667
#> 12:     B     2          2    0.6666667

相关问题