我正在使用这样一行代码:
mpg %>% count(~cyl)
但现在我试图在lapply
循环中运行计数(以及其后的几十行代码)。
我想做的是根据几个列计算数据。
即:
groupby <- c("cyl", "year", "trans")
lapply(groupby, function(x) {
mpg %>% count(~x)
})
然而,当x是循环中的字符串时,我无法使mpg %>% count(~x)
起作用。
我尝试过几种方式使用as.function(),但没有成功。我确定这里的一个天才比我在谷歌花4个小时重新发明轮子更快地知道解决方案。
如果您知道如何使用,请提前致谢!
P.S。我的分组列是所有因素, 所有其他列都是数字
答案 0 :(得分:1)
我们可以使用sym
中的rlang
将其转换为符号,然后使用!!
进行评估
library(tidyverse)
map(groupby, ~
mpg %>%
count(!!rlang::sym(.x)))
#[[1]]
# A tibble: 4 x 2
# cyl n
# <int> <int>
#1 4 81
#2 5 4
#3 6 79
#4 8 70
#[[2]]
# A tibble: 2 x 2
# year n
# <int> <int>
#1 1999 117
#2 2008 117
#[[3]]
# A tibble: 10 x 2
# trans n
# <chr> <int>
# 1 auto(av) 5
# 2 auto(l3) 2
# 3 auto(l4) 83
# 4 auto(l5) 39
# 5 auto(l6) 6
# 6 auto(s4) 3
# 7 auto(s5) 3
# 8 auto(s6) 16
# 9 manual(m5) 58
#10 manual(m6) 19
还可以选择将group_by_at
与summarise
map(groupby, ~ mpg %>%
group_by_at(.x) %>%
summarise(n = n()))
data(mpg)
答案 1 :(得分:1)
除了@ akrun更优雅的解决方案之外,您还可以执行以下操作:
groupby <- c("cyl", "year", "trans");
library(dplyr);
mpg[groupby] %>%
gather(key, value) %>%
count(key, value)
## A tibble: 16 x 3
# key value n
# <chr> <chr> <int>
# 1 cyl 4 81
# 2 cyl 5 4
# 3 cyl 6 79
# 4 cyl 8 70
# 5 trans auto(av) 5
# 6 trans auto(l3) 2
# 7 trans auto(l4) 83
# 8 trans auto(l5) 39
# 9 trans auto(l6) 6
#10 trans auto(s4) 3
#11 trans auto(s5) 3
#12 trans auto(s6) 16
#13 trans manual(m5) 58
#14 trans manual(m6) 19
#15 year 1999 117
#16 year 2008 117
这会生成一个data.frame
/ tibble
,您可以通过以下方式进一步处理:按key
分组条目。
上述解决方案也适用于factor
级别。例如:
iris[c("Species")] %>%
gather(key, value) %>%
count(key, value)
## A tibble: 3 x 3
# key value n
# <chr> <chr> <int>
#1 Species setosa 50
#2 Species versicolor 50
#3 Species virginica 50