将不同的数据应用于R中的函数

时间:2018-09-12 10:54:35

标签: r tidyverse purrr

我有以下数据框:

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中使用的函数与以下数据帧一起应用:

  • df
  • df_2
  • df_3

当然,这是一个最小的示例,因此我正在寻找一种有效的方法。最好使用purrr软件包。

2 个答案:

答案 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点估算的结果,等等。