операции по групповым функциям внутри функции и опции в нескольких столбцах - PullRequest
1 голос
/ 19 января 2020

Я хочу сделать несколько похожих операций над столбцами в кадре данных, который я использую. Смотрите ссылку , чтобы получить базу данных [не большой файл], которая генерируется dput()

Я хочу, чтобы над столбцами cols= c("debt_GDP", "Top10"), сгруппированными по group_by(year,country_name_iso3), выполнялись следующие три операции:

  1. inter = na.interpolation(cols, option = "spline")
  2. sm=fitted(smooth.spline(cols_intep))
  3. rollmean=rollmean(cols_intep,10, fill = NA)

Вот пример с один столбец:

# interpolate missing values
df_us   <-subset(pkt, country_name_iso3=="USA")
df_us   <-droplevels(df_us)
df_us$debt_intep <-na.interpolation(df_us$debt_GDP, option = "spline")
df_us$top10_intep <-na.interpolation(df_us$Top10, option = "spline")

# smooth series with moving average 
df_us$debt_sm <- fitted(smooth.spline(df_us$debt_intep))
df_us$top10_sm <- fitted(smooth.spline(df_us$top10_intep))

# rolling mean 
df_us$debt_sm_rollmean<-rollmean(df_us$debt_sm,10, fill = NA)
df_us$top10_sm_rollmean<-rollmean(df_us$top10_sm,10, fill = NA)

Я хочу точно так же для каждого из c("debt_GDP", "Top10") столбцов, сгруппированных по c(year,country_name_iso3)

Какой код наиболее эффективен для этого?

1 Ответ

1 голос
/ 19 января 2020
library(tidyverse)
library(imputeTS)
library(zoo)

Использование mutate_at три раза:

read_delim('dput.df.txt', delim = ' ') %>% 
  group_by(country_name_iso3) %>% 
  mutate_at(.vars = c('debt_GDP', 'Top10'), 
            .funs = list(inter = ~na_interpolation(., option = "spline"))) %>% 
  mutate_at(.vars = c('debt_GDP_inter', 'Top10_inter'), 
            .funs = list(sm = ~fitted(smooth.spline(.)))) %>% 
  mutate_at(.vars = c('debt_GDP_inter_sm', 'Top10_inter_sm'), 
            .funs = list(rollmean = ~rollmean(., 10, fill = NA)))

Или объединить в одну функцию:

func <- function(x) {
  inter = na_interpolation(x, option = 'spline')
  sm = fitted(smooth.spline(inter))
  rollmean = rollmean(sm, 10, fill = NA)
}


read_delim('dput.df.txt', delim = ' ') %>% 
  group_by(country_name_iso3) %>% 
  mutate_at(.vars = c('debt_GDP', 'Top10'), .funs = func)

Построение графика вывода

read_delim('dput.df.txt', delim = ' ') %>% 
  group_by(country_name_iso3) %>% 
  mutate_at(.vars = c('debt_GDP', 'Top10'), .funs = func) %>% 
  ggplot() +
  geom_line(aes(year, debt_GDP, color=country))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...