首页 > 解决方案 > R: 如何在 group_by 之后使用 group_map 运行自定义函数?

问题描述

鉴于此,我有一个数据框如下:

dt <- data.frame(year = sample(c(2000:2019),100,replace = T ),
                 month = sample(c(1:12),100,replace = T ),
                 paitent_ID = sample(c(1:50),100,replace = T ),
                 state = sample(c(1:10),100,replace = T ) )

我需要在排序group by后将以下函数应用于此数据集:

newState <- function(dt){

  dt["new"]= dt[0,"state"]*3 
  dt

}

因此,该函数应该为new每个组添加一个名为的新列。

这是group_by:

library(dplyr)
dt %>% 
 group_by(paitent_ID) %>%
 group_map(  ~ .x %>%
               arrange( year,month)) %>%
 group_map( ~ .x %>%
              newState())

当我运行代码时,它抱怨:

Error in UseMethod("group_split") : 
  no applicable method for 'group_split' applied to an object of class "list"

标签: r

解决方案


正如@André Oliveira 在评论中提到的,建议mutate用于添加列。但是,可以group_modify在对函数进行一些小的更改后这样做。

newState <- function(dt, groupvars){

  dt["new"]= dt[1,"state"]*3 
  dt

}

dt %>% 
  group_by(paitent_ID) %>% 
  arrange(year, month) %>% 
  group_modify(newState) %>% 
  ungroup

# # A tibble: 100 x 5
#    paitent_ID  year month state   new
#         <int> <int> <int> <int> <dbl>
#  1          1  2006     5     3     9
#  2          2  2012    12     3     9
#  3          3  2013    11     8    24
#  4          3  2014    10     1    24
#  5          3  2019     5     6    24
#  6          4  2006     7     5    15
#  7          4  2006     7     2    15
#  8          5  2003     8     8    24
#  9          7  2015    12     2     6
# 10          7  2017     8    10     6

还有一种更传统的方法

dt %>% 
  group_by(paitent_ID) %>% 
  arrange(year, month) %>% 
  mutate(new = state[1]*3)

推荐阅读