【问题标题】:Replicate dlply() funcationality in dplyr在 dplyr 中复制 dlply() 功能
【发布时间】:2018-05-04 16:12:29
【问题描述】:

plyr 包具有多种 _ply 函数,其中前两个字母指的是输入和输出,因此 ddply 接受数据帧输入并产生数据帧输出,dlply 接受数据帧输入并产生一个列表输出。由于多种原因,我通常更喜欢使用dplyr 包,而plyrdplyr 在单个环境中不能很好地协同工作。有没有办法在dplyr 的管道语法中从plyr 复制dlply 函数的“数据框输入,列出”功能?

我想复制的功能的一个简单示例:

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 创建新列那样创建列表元素

【问题讨论】:

  • 请看我的帖子和我的更新。如果您正在寻找数据框,请列出,然后拆分数据框并使用maplapply 应用函数对我来说很有意义。

标签: r dplyr plyr


【解决方案1】:

我们可以通过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

【讨论】:

  • 您的原始版本实际上也可以正常工作。对于我的特定应用程序,我实际上并不需要一个列表,我只需要返回 smooth.spline 对象,并且不知道如何将它们存储在数据框中。您的原始解决方案和此解决方案都允许我调用 smooth.spline 对象。
猜你喜欢
  • 2018-06-19
  • 1970-01-01
  • 2018-09-05
  • 2023-01-19
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多