Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
plyr::mutate和dplyr::mutate之间的差异_R_Plyr_Dplyr - Fatal编程技术网

plyr::mutate和dplyr::mutate之间的差异

plyr::mutate和dplyr::mutate之间的差异,r,plyr,dplyr,R,Plyr,Dplyr,dplyr::mutate()的工作方式与plyr::mutate()相同,与base::transform()类似。mutate()和transform()之间的关键区别在于mutate允许您引用刚刚创建的列。-dplyr简介 dplyr和plyr中的mutate函数之间存在一些差异。主要区别当然是plyr::mutate可以应用于lists,而dplyr::mutate更快 此外,在引用刚创建的列时,plyr不能再次重新分配它们,但dplyr可以 # creating a temporary

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

dplyr
plyr
中的
mutate
函数之间存在一些差异。主要区别当然是
plyr::mutate
可以应用于
list
s,而
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
现在我正在寻找
列表
对象的
dplyr
mutate
函数的功能。因此,我正在寻找一个函数,它可以改变
列表
,并且可以重新分配刚刚创建的变量

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)

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


不确定它是否有用,但您是否查看了rlist软件包?它支持列表上的许多操作,包括do.call-type函数,该函数可能与dplyr::mutate一起使用。
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