gpt4 book ai didi

r - "summarise_at"和 "mutate_if"用于字符变量的描述性统计

转载 作者:行者123 更新时间:2023-12-01 13:27:56 24 4
gpt4 key购买 nike

我想同时对多个字符变量使用 summarise_atmutate_at。我看过很多使用整数变量的例子,但我就是想不通字符变量。正下方是我用来为字符(或因子)变量生成描述性统计信息的代码。

library(tidyverse)

# First block of code
starwars %>%
group_by(gender) %>%
summarise (n = n()) %>%
mutate(totalN = (cumsum(n))) %>%
mutate(percent = round((n / sum(n)), 3)) %>%
mutate(cumpercent = round(cumsum(freq = n / sum(n)),3))

这会产生:

A tibble: 5 x 5
gender n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 female 19 19 0.218 0.218
2 hermaphrodite 1 20 0.011 0.230
3 male 62 82 0.713 0.943
4 none 2 84 0.023 0.966
5 <NA> 3 87 0.034 1.000

我想生成同样的东西,但是一次生成多个字符(或因子)变量。在这种情况下,让我们使用变量 gendereye_color 这是我尝试过的:

starwars %>%        
summarise_at(vars(gender, eyecolor) (n = n()) %>%
mutate_at(vars(gender, eyecolor) (totalN = (cumsum(n))) %>%
mutate_at(vars(gender", "eyecolor) (percent = round((n / sum(n)), 3)) %>%
mutate_at(vars(gender, eyecolor) (cumpercent = round(cumsum(freq = n / sum(n)),3))))))

我收到以下错误:

Error in eval(expr, envir, enclos) : attempt to apply non-function

我知道有使用 funs 调用的内置函数,但我不想使用它们。我曾尝试以多种不同的方式使用代码来使其正常工作,但效果不佳。

我想制作的是这样的:

A tibble: 5 x 5
gender n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 female 19 19 0.218 0.218
2 hermaphrodite 1 20 0.011 0.230
3 male 62 82 0.713 0.943
4 none 2 84 0.023 0.966
5 <NA> 3 87 0.034 1.000

A tibble: 15 x 5
eye_color n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 black 10 10 0.115 0.115
2 blue 19 29 0.218 0.333
3 blue-gray 1 30 0.011 0.345
4 brown 21 51 0.241 0.586
5 dark 1 52 0.011 0.598
6 gold 1 53 0.011 0.609
7 green, yellow 1 54 0.011 0.621
8 hazel 3 57 0.034 0.655
9 orange 8 65 0.092 0.747
10 pink 1 66 0.011 0.759
11 red 5 71 0.057 0.816
12 red, blue 1 72 0.011 0.828
13 unknown 3 75 0.034 0.862
14 white 1 76 0.011 0.874
15 yellow 11 87 0.126 1.000

也许循环会更好?现在我有很多代码行来为每个字符变量生成描述性统计信息,因为我必须为每个变量运行第一个代码块(如上所述)。如果我可以列出我想使用的变量并在第一段代码中运行每个变量,那就太好了。

最佳答案

根据您的预期输出,mutate_at 不是您想要的,因为它会在所选列上发生变异。你想要做的是将 group_by gendereye_color 分开。这是将摘要代码写入函数的好地方:

library(tidyverse)
library(rlang)

summary_func = function(group_by_var){
group_by_quo = enquo(group_by_var)
starwars %>%
group_by(!!group_by_quo) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3),
cumpercent = round(cumsum(freq = n / sum(n)),3))
}

结果:

> summary_func(gender)
# A tibble: 5 x 5
gender n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 female 19 19 0.218 0.218
2 hermaphrodite 1 20 0.011 0.230
3 male 62 82 0.713 0.943
4 none 2 84 0.023 0.966
5 <NA> 3 87 0.034 1.000

> summary_func(eye_color)
# A tibble: 15 x 5
eye_color n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 black 10 10 0.115 0.115
2 blue 19 29 0.218 0.333
3 blue-gray 1 30 0.011 0.345
4 brown 21 51 0.241 0.586
5 dark 1 52 0.011 0.598
6 gold 1 53 0.011 0.609
7 green, yellow 1 54 0.011 0.621
8 hazel 3 57 0.034 0.655
9 orange 8 65 0.092 0.747
10 pink 1 66 0.011 0.759
11 red 5 71 0.057 0.816
12 red, blue 1 72 0.011 0.828
13 unknown 3 75 0.034 0.862
14 white 1 76 0.011 0.874
15 yellow 11 87 0.126 1.000

这个想法是将您的摘要代码变成一个函数,这样您就可以将相同的代码应用于不同的 group_by 变量。 rlang 中的 enquo 获取提供给 group_by_var 的代码,并将其与调用它的环境捆绑到 quosure 中.然后,您可以使用 !! 取消引用 group_by 步骤中的 group_by_quo。这会启用非标准评估(即键入 summary_func(gender) 而不是 summary_func("gender")

如果你不想为你想要group_by的每个变量调用summary_func,你可以将你的dplyr代码包装在map 来自 purrr,并取消引用作为 ... 参数提供的 group_by_quo 的每个参数。请注意从 enquoquos 的更改,以将 ... 的每个参数转换为 quosure 的列表:

summary_func = function(...){
group_by_quo = quos(...)

map(group_by_quo, ~{
starwars %>%
group_by(!!.x) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3),
cumpercent = round(cumsum(freq = n / sum(n)),3))
})
}

您现在可以这样做:

summary_func(gender, eye_color)

或将字符变量名称的向量用于 group_by:

group_vars = c("gender", "eye_color")
summary_func(!!!syms(group_vars))

结果:

[[1]]
# A tibble: 5 x 5
gender n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 female 19 19 0.218 0.218
2 hermaphrodite 1 20 0.011 0.230
3 male 62 82 0.713 0.943
4 none 2 84 0.023 0.966
5 <NA> 3 87 0.034 1.000

[[2]]
# A tibble: 15 x 5
eye_color n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 black 10 10 0.115 0.115
2 blue 19 29 0.218 0.333
3 blue-gray 1 30 0.011 0.345
4 brown 21 51 0.241 0.586
5 dark 1 52 0.011 0.598
6 gold 1 53 0.011 0.609
7 green, yellow 1 54 0.011 0.621
8 hazel 3 57 0.034 0.655
9 orange 8 65 0.092 0.747
10 pink 1 66 0.011 0.759
11 red 5 71 0.057 0.816
12 red, blue 1 72 0.011 0.828
13 unknown 3 75 0.034 0.862
14 white 1 76 0.011 0.874
15 yellow 11 87 0.126 1.000

关于r - "summarise_at"和 "mutate_if"用于字符变量的描述性统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com