【发布时间】:2015-05-02 23:10:19
【问题描述】:
dplyr::mutate()的工作方式与plyr::mutate()相同,与base::transform()类似。mutate()和transform()之间的主要区别在于mutate允许您引用刚刚创建的列。 - dplyr 简介
dplyr 和plyr 中的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 一起使用。