我有一个带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的函数,否则不适用,则可以。
答案 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))