【发布时间】:2021-12-17 12:39:15
【问题描述】:
我有一些这种格式的数据:
#> # A tibble: 3 × 5
#> item cost blue pink black
#> <int> <int> <int> <int> <int>
#> 1 1 4 1 0 1
#> 2 2 10 1 0 1
#> 3 3 3 0 1 1
我想要的输出是颜色列的相对频率。项目可以有不止一种颜色,因此相对频率不必总和为 1。
#> color rel_freq
#> <int> <int>
#> 1 blue 0.66
#> 2 pink 0.33
#> 2 black 1.00
我可以手动处理一种颜色,比如蓝色:
library(tidyverse)
df <- tibble::tribble(
~item, ~cost, ~blue, ~pink, ~black,
1L, 4L, 1L, 0L, 1L,
2L, 10L, 1L, 0L, 1L,
3L, 3L, 0L, 1L, 1L
)
df %>%
group_by(blue) %>%
summarise(count = n()) %>%
mutate(rel_freq = (count/sum(count)*100) ) %>%
filter(blue==1) %>%
mutate(color = deparse(substitute(blue))) %>%
select(-blue, -count) %>%
select(color, everything())
给了
#> color rel_freq
#> <chr> <dbl>
#> 1 blue 66.7
但是当我把它放到一个函数中时,我不知道如何传入一个参数,以便它可以被视为一个列(使用“curly-curly”符号)和一个字符变量(这就是我被卡住了)。
calc_rel_freq <- function(input_color){
df %>%
group_by({{input_color}}) %>%
summarise(count = n()) %>%
mutate(rel_freq = (count/sum(count)*100) ) %>%
filter({{input_color}}==1) %>%
mutate(color = deparse(substitute({{input_color}}))) %>% # This is where I'm stuck.
select(-{{input_color}}, -count) %>%
select(color, everything())
}
calc_rel_freq(blue)
我的最终目标是能够使用这样的函数:
input_colors <- c("blue", "pink", "black")
map(input_colors, calc_relative_freq)
数据输入代码如下:
library(tidyverse)
df <- tibble::tribble(
~item, ~cost, ~blue, ~pink, ~black,
1L, 4L, 1L, 0L, 1L,
2L, 10L, 1L, 0L, 1L,
3L, 3L, 0L, 1L, 1L
)
df
【问题讨论】: