【问题标题】:Return list of functions with dplyr使用 dplyr 返回函数列表
【发布时间】:2019-06-10 16:46:39
【问题描述】:

我有一个带有 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))

我不关心原始数据(其中包含多个组、x、y),因此返回值可以是函数的命名列表,或者我可以使用组变量引用并获得拟合样条函数的任何内容.用例是迭代具有组和插值坐标 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 列应用 fns 不为 NULL 且不为 NA 的函数来改变 newData,否则我就完成了。

【问题讨论】:

  • 如果您正在迭代第二个数据集,则在汇总步骤之后,按“组”进行连接,然后对第二个数据中感兴趣的变量应用 splinefun 列进行变异跨度>

标签: r dplyr tidyverse


【解决方案1】:

我们可以用list包装输出函数

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

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


如果我们想在相应“组”上的另一个数据集上应用函数,则与第二个数据集进行连接,并使用map2 将存储在第一个数据列中的函数应用到第二个数据的感兴趣列上

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

更新

基于 OP 帖子中的更新数据

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))

数据

df2 <- data.frame(group = 1:3, xval = c(1.5, 2.5, 3.2))
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))

【讨论】:

  • 我实际上用“do”得到了相同的结果,但是我如何引用这个函数呢?假设我想在 group=1 上获得 x=1.5 的 y ?
  • @user3173412。你需要df %&gt;% group_by(group) %&gt;% summarise(val = splinefun(x, y)(1.5))
  • 不,我需要将其应用于 xs. I need to iterate over a second data frame with 800 records with groups and xs 的任意数字。
  • 对不起!一切都很好,正是 ctrl + shift + enter 操作更进一步并获得了一些额外的代码!哦!谢谢 :) 如果不使用“公式”语法,我将如何指定它?
  • 谢谢!诗歌和小词的新手:) 这对我很有启发,需要阅读!想知道为什么我们的 tibble 中不能有数据类型函数,而是需要把它放在一个列表中。即列可以有列表类型,具有函数的 1d 列表条目,为什么不只是函数的列/数据类型。 .
猜你喜欢
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
相关资源
最近更新 更多