【问题标题】:difference between plyr::mutate and dplyr::mutateplyr::mutate 和 dplyr::mutate 之间的区别
【发布时间】:2015-05-02 23:10:19
【问题描述】:

dplyr::mutate() 的工作方式与plyr::mutate() 相同,与base::transform() 类似。 mutate()transform() 之间的主要区别在于 mutate 允许您引用刚刚创建的列。 - dplyr 简介

dplyrplyr 中的mutate 函数存在一些差异。主要区别当然是plyr::mutate 可以应用于lists 并且dplyr::mutate 更快。

此外,当引用刚刚创建的列时,plyr 不能再次重新分配它们,但 dplyr 可以。

# creating a temporary variable and removing it later
plyr::mutate(data.frame(a = 2), tmp = a, c = a*tmp, tmp = NULL) 
## a tmp c
## 1 2   2 4
dplyr::mutate(data.frame(a = 2), tmp = a, c = a*tmp, tmp = NULL)
## a c
## 1 2 4

# creating a temporery variable and changing it later
plyr::mutate(data.frame(a = 2), b = a, c = a*b, b = 1)
## a b c
## 1 2 2 4
dplyr::mutate(data.frame(a = 2), b = a, c = a*b, b = 1)
## a b c
## 1 2 1 4

现在我正在寻找 list 对象的 dplyr mutate 函数的功能。所以我正在寻找一个可以改变list 并且可以重新分配刚刚创建的变量的函数。

plyr::mutate(list(a = 2), b = a, c = a*b, b = 1)
## $a
## [1] 2
## 
## $b
## [1] 2
## 
## $c
## [1] 4
dplyr::mutate(list(a = 2), b = a, c = a*b, b = 1)
## Error in UseMethod("mutate_") : 
##   no applicable method for 'mutate_' applied to an object of class "list"
desired_mutate(list(a = 2), b = a, c = a*b, b = 1)
## $a
## [1] 2
## 
## $b
## [1] 1
## 
## $c
## [1] 4

我意识到在这种简单的情况下,我可以使用

plyr::mutate(list(a = 2), c = {b = a; a*b})

但在我的实际用例中,我将随机数分配给一个临时变量,然后想将其删除。类似于以下内容:

desired_mutate(list(a = c(1, 2, 5, 2)), 
                    tmp = runif(length(a)), 
                    b = tmp * a, 
                    c = tmp + a,
                    tmp = NULL)

【问题讨论】:

  • 不确定它是否有用,但你看过 rlist 包吗?它启用了对列表的许多操作,包括一个 do.call-type 函数,它可能与 dplyr::mutate 一起使用。

标签: r plyr dplyr


【解决方案1】:

更正了 mutate 函数中的原始 for 循环(使用 cols 位置而不是名称):

desired_mutate <- function (.data, ...) 
{
  stopifnot(is.data.frame(.data) || is.list(.data) || is.environment(.data))
  cols <- as.list(substitute(list(...))[-1])
  cols <- cols[names(cols) != ""]
  col_names <- names(cols)
  for (i in seq_along(col_names) ) {
    if(!is.null(cols[[i]])) {
      .data[[col_names[i]]] <- eval(cols[[i]], .data, parent.frame()) 
    } else {
      .data[[col_names[i]]] <- NULL
    }
  }
  .data
}

测试:

> str( desired_mutate(list(a = c(1, 2, 5, 2)), 
+                tmp = runif(length(a)), 
+                b = tmp * a, 
+                c = tmp + a,
+                tmp = NULL) )
List of 3
 $ a: num [1:4] 1 2 5 2
 $ b: num [1:4] 0.351 1.399 3.096 1.4
 $ c: num [1:4] 1.35 2.7 5.62 2.7

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多