Применить разные данные к функции в R - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующий фрейм данных:

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 голосов
/ 12 сентября 2018

Вот одно из возможных решений:

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], чтобы увидеть результаты для вашей двухточечной оценки и т. Д.

0 голосов
/ 12 сентября 2018

Использование 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))
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...