我有以下数据框:
library(tidyverse)
set.seed(1234)
df <- data.frame(
x = seq(1, 100, 1),
y = rnorm(100)
)
在使用不同结点应用平滑样条线的地方:
nknots <- seq(4, 15, 1)
output <- map(nknots, ~ smooth.spline(x = df$x, y = df$y, nknots = .x))
我现在要做的是使用2点和3点平均值来应用相同的函数:
df_2 <- df %>%
group_by(., x = round(.$x/2)*2) %>%
summarise_all(funs(mean))
df_3 <- df %>%
group_by(., x = round(.$x/3)*3) %>%
summarise_all(funs(mean))
总而言之,我需要将output
中使用的函数与以下数据帧一起应用:
当然,这是一个最小的示例,因此我正在寻找一种有效的方法。最好使用purrr
软件包。
答案 0 :(得分:2)
使用lapply和库zoo
以更简单,更优雅的方式计算移动平均值:
library(zoo)
lapply(1:3,function(roll){
dftemp <- as.data.frame(rollmean(df,roll))
map(nknots, ~ smooth.spline(x = dftemp$x, y = dftemp$y, nknots = .x))
})
答案 1 :(得分:1)
这是一种可能的解决方案:
library(tidyverse)
set.seed(1234)
df <- data.frame(x = seq(1, 100, 1),
y = rnorm(100))
# funtion to get v-point averages
GetAverages = function(v) {
df %>%
group_by(., x = round(.$x/v)*v) %>%
summarise_all(funs(mean)) }
# specify nunber of knots
nknots <- seq(4, 15, 1)
dt_res = tibble(v=1:3) %>% # specify v-point averages
mutate(d = map(v, GetAverages)) %>% # get data for each v-point
crossing(., data.frame(nknots=nknots)) %>% # combine each dataset with a knot
mutate(res = map2(d, nknots, ~smooth.spline(x = .x$x, y = .x$y, nknots = .y))) # apply smooth spline
您可以使用dt_res$res[dt_res$v == 1]
查看原始数据集的所有结果,dt_res$res[dt_res$v == 2]
查看2点估算的结果,等等。