微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 dtplyr 时,将函数输入中的列用于 group_by 变量

如何解决使用 dtplyr 时,将函数输入中的列用于 group_by 变量

尝试使用 dtplyr 按组汇总列时,分组似乎不起作用。由于组变量是我函数的输入,我尝试使用 group_by_ 只收到错误消息。

数据:

df <- data.frame(
  id=c(1,1,2,3,3),year=c(2014,2015,2016,NA,2016),code=c(1,4,5),dv1=1:9,dv2=2:10
) %>% as.data.table()

cols <- c("dv1","dv2")

> df
   id year code dv1 d2
1:  1 2014    1   1  2
2:  1 2015    2   2  3
3:  1 2016    2   3  4
4:  2 2015    1   4  5
5:  2 2015    2   5  6
6:  2 2016    3   6  7
7:  3   NA    3   7  8
8:  3   NA    4   8  9
9:  3 2016    5   9 10

功能

for(i in seq_along(columns)) {
 sub1 <- df %>% 
   select("id",columns[i],group) %>%
   group_by(group) %>%
   summarise(mean=mean(.data[[columns[i]]],na.rm=T),sd=sd(.data[[columns[i]]],na.rm=T)) %>%
   ungroup() %>%
   as_tibble() 
 print(sub1)
}
}

test(data=df,columns=cols,group="year")

# A tibble: 1 x 3
  group  mean    sd
  <chr> <dbl> <dbl>
1 year      5  2.74
# A tibble: 1 x 3
  group  mean    sd
  <chr> <dbl> <dbl>
1 year      6  2.74

解决方法

这是一个 reprex,我认为它与您要查找的内容相似。这不是有史以来最性感的解决方案,但它会起作用:

library(tidyverse)
f <- function(grouping_var) {
    iris %>%
        group_by(!!sym(grouping_var)) %>%
        summarize(N = n())
}

f('Species')
#> # A tibble: 3 x 2
#>   Species        N
#> * <fct>      <int>
#> 1 setosa        50
#> 2 versicolor    50
#> 3 virginica     50

reprex package (v1.0.0) 于 2021 年 3 月 17 日创建

,

我们可以使用.data

f<- function(dat,grouping_var) {
     dat %>%
         group_by(.data[[grouping_var]]) %>%
         summarise(N = n())
  }

-测试

f(iris,"Species")
# A tibble: 3 x 2
#  Species        N
#* <fct>      <int>
#1 setosa        50
#2 versicolor    50
#3 virginica     50

使用 OP 的示例数据

library(purrr)
map(cols,dat = df,.f = f)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。