在lapply中计算几列

时间:2018-03-27 11:06:37

标签: r string syntax count

我正在使用这样一行代码:

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。我的分组列是所有因素, 所有其他列都是数字

2 个答案:

答案 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_atsummarise

一起使用
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