Функциональность репликации dlply () в dplyr - PullRequest
0 голосов
/ 04 мая 2018

Пакет plyr имеет множество функций _ply, в которых первые две буквы относятся к вводу и выводу, так что ddply принимает ввод данных и выводит данные, а dlply принимает данные ввод и вывод списка. По разным причинам я обычно предпочитаю использовать пакет dplyr, а plyr и dplyr не очень хорошо работают вместе в одной среде. Есть ли способ реплицировать функциональность «фрейм данных в списке» функции dlply из plyr в синтаксисе конвейера dplyr?

Простой пример функциональности, которую я хотел бы воспроизвести:

data = data.frame(x = rep(seq(from = 1, to = 100, by = 1), times = 3), 
              y = rnorm(n = 300), 
              group_var = c(rep("A", 100), rep("B", 100), rep("C", 100)))

spline.fun = function(x, xvar, yvar, ...) {
  smooth.spline(x = x[,xvar], y = x[,yvar], ...)
}

spline_list = dlply(data, "group_var", spline.fun, xvar = "x", yvar = "y")

Код, который я хотел бы написать, выглядит примерно так:

spline_list = data %>%
    group_by(group_var) %>%
    list_mutate(list_element = spline.fun, xvar = x, yvar = y)

но, насколько мне известно, не существует функции dplyr, которая создает элемент списка так же, как и метод mutate создает новый столбец

1 Ответ

0 голосов
/ 04 мая 2018

Мы можем разделить фрейм данных на group_var, используйте map из пакета , чтобы применить вашу функцию.

library(tidyverse)

data2 <- data %>%
  split(f = data$group_var) %>%
  map(~spline.fun(.x, xvar = "x", yvar = "y"))
# $`A`
# Call:
#   smooth.spline(x = x[, xvar], y = x[, yvar])
# 
# Smoothing Parameter  spar= 1.315545  lambda= 14.95228 (20 iterations)
# Equivalent Degrees of Freedom (Df): 2.016214
# Penalized Criterion (RSS): 74.08271
# GCV: 0.7716288
# 
# $B
# Call:
#   smooth.spline(x = x[, xvar], y = x[, yvar])
# 
# Smoothing Parameter  spar= 1.499963  lambda= 321.1298 (29 iterations)
# Equivalent Degrees of Freedom (Df): 2.000764
# Penalized Criterion (RSS): 77.98068
# GCV: 0.8119731
# 
# $C
# Call:
#   smooth.spline(x = x[, xvar], y = x[, yvar])
# 
# Smoothing Parameter  spar= 1.499953  lambda= 321.0788 (27 iterations)
# Equivalent Degrees of Freedom (Df): 2.000764
# Penalized Criterion (RSS): 104.8997
# GCV: 1.092268
...