使用dplyr返回函数列表

时间:2019-01-16 14:57:19

标签: r dplyr tidyverse

我有一个带x,y坐标和分组变量的data.frame:

df<-data.frame(group=c(rep(1,3),rep(2,3),rep(3,3)),
               x=c(rep(c(1,2,3),3)),
               y=c(1,2,3,1,4,9,1,8,27))

我想为每个组安装一个样条函数以供以后使用。符合以下条件的

df %>% group_by(group) %>% .... foo(splinefun(x,y))

我不在乎原始数据(包含的数据不止于group,x,y),因此返回值可以是函数的命名列表,也可以是我可以使用group变量引用并获得合适的样条函数的任何内容。用例正在使用组和插值坐标x遍历第二个数据集。 有人吗?

编辑

因此,使用newData进行更新的示例包含一个未包含在拟合函数标题中的组:

df<-data.frame(group=c(rep(1,4),rep(2,4),rep(3,4)),
               x=c(rep(c(0,1,2,3),3)),
               y=c(0,1,2,3,0,1,4,9,0,1,8,27))

fit<-df %>% 
  group_by(group) %>% 
  summarise(fns = list(approxfun(x, y)))

newData <- data.frame(group=c(rep(1,5),rep(2,5),rep(3,5),rep(4,5)) , 
                      xval = rep(c(0,1,2,3,4),4)) %>% 
                      left_join(fit)

因此,拟合的幂函数现在与扩展的组集合结合在一起,其中缺少的记录中的列 fns 为NULL。如果我现在可以使用 interpolated 列对newData进行变异,并应用 fns 不为NULL的函数,否则不适用,则可以。

1 个答案:

答案 0 :(得分:0)

我们可以通过用list包裹功能来输出该功能

library(tidyverse)
df %>% 
    group_by(group) %>%
    summarise(fns = list(splinefun(x, y)))

如果要在原始数据中创建一列,请用summarise替换mutate。但是,这将对组的每一行重复该功能


如果我们想将函数应用于相应“组”上的另一个数据集,则对第二个数据集进行联接,并使用{{1将存储在目标列中第一列中的函数应用于第二个数据中}}

map2

更新

基于OP帖子中的更新数据

df %>% 
   group_by(group) %>% 
   summarise(fns = list(splinefun(x, y))) %>% 
   left_join(df2) %>% 
   mutate(newval = map2_dbl(fns, xval, ~ .x(.y)))

或使用fit %>% right_join(newData) %>% mutate(newval = map2_dbl(fns, xval, ~ if(!is.null(.x)) .x(.y) else NA_real_)) (来自possibly)创建函数并应用

purrr

数据

f1 <- possibly(function(x, y) x(y), otherwise = NA_real_)
fit %>% 
  right_join(newData) %>% 
  mutate(newval = map2_dbl(fns, xval, f1))