我所拥有的:
library("dplyr")
mtcars %>% count(cyl, gear)
#> cyl gear n
#> 1 4 3 1
#> 2 4 4 8
#> 3 4 5 2
#> 4 6 3 2
#> 5 6 4 4
#> 6 6 5 1
#> 7 8 3 12
#> 8 8 5 2
我需要的是:
#> variable1 category1 variable2 category2 n
#> 1 cyl 4 gear 3 1
#> 2 cyl 4 gear 4 8
#> 3 cyl 4 gear 5 2
#> 4 cyl 6 gear 3 2
#> 5 cyl 6 gear 4 4
#> 6 cyl 6 gear 5 1
#> 7 cyl 8 gear 3 12
#> 8 cyl 8 gear 5 2
关键是传递给count()
的变量(在本例中为cyl
和gear
)不是固定的,而且变量的数量可以从1向上变化.它们将作为参数传递给更广泛的函数.因此,我正在寻找一个解决方案,将工作很好的curly-curly
或类似.变量的名称没有遵循任何模式.
我曾考虑过使用多个调用tidyr::pivot_longer()
,但我不能计算出这将如何工作与不同数量的变量.
我认为一个更好的方法可能是在使用dplyr::cur_column()
的同时使用dplyr::across()
.类似于下面的伪代码:
var_count <- function(cnt_var) {
mtcars %>%
count(across({{ cnt_var }})) %>% # this works as intended
mutate(across({{ cnt_var }}, \(col) cur_column(), .names = "category")) %>% # an attempt to create the 'variable' names. doesn't work when length(cnt_var) > 1
rename_with(.cols = {{ cnt_var }}, .fn = "category") # a thought about how to create the 'category' columns
}
var_count(cnt_var = c(cyl)) # this ideally should produce one name-value pair: variable1 and category1
var_count(cnt_var = c(cyl, gear)) # this should produce two pairs: variable1, category1, variable2, category2
var_count(cnt_var = c(cyl, gear, vs)) # this should produce three pairs, etc
我最喜欢tidyverse
的解决方案,但所有的建议都是最受欢迎的.谢谢大家!