在 dplyr 中复制 dlply() 功能
Replicate dlply() funcationality in dplyr
plyr
包有多种 _ply
函数,其中前两个字母指的是输入和输出,因此 ddply
接受数据帧输入并产生数据帧输出, dlply
接受一个数据帧输入并产生一个列表输出。由于各种原因,我通常更喜欢使用 dplyr
包,而 plyr
和 dplyr
在单一环境中不能很好地协同工作。有没有办法在 dplyr
的管道语法中从 plyr
复制 dlply
函数的 "data frame in, list out" 功能?
我想复制的功能的一个简单示例:
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 创建新列的方式那样创建列表元素
我们可以通过 group_var
拆分数据框,使用 purrr 包中的 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
plyr
包有多种 _ply
函数,其中前两个字母指的是输入和输出,因此 ddply
接受数据帧输入并产生数据帧输出, dlply
接受一个数据帧输入并产生一个列表输出。由于各种原因,我通常更喜欢使用 dplyr
包,而 plyr
和 dplyr
在单一环境中不能很好地协同工作。有没有办法在 dplyr
的管道语法中从 plyr
复制 dlply
函数的 "data frame in, list out" 功能?
我想复制的功能的一个简单示例:
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 创建新列的方式那样创建列表元素
我们可以通过 group_var
拆分数据框,使用 purrr 包中的 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