【问题标题】:Difference between dplyr:mutate and transform when using pmin and pmax?使用pmin和pmax时dplyr:mutate和transform之间的区别?
【发布时间】:2014-07-14 18:53:44
【问题描述】:

在尝试回答this question 时,我遇到了mutatetransform 之间的差异,这是我期望的等效操作。

# data
x <- data.frame(a=c(rep(0,10),rep(1,10),3),b=c(1:10,0,11:19,0))

#transform
transform(x,a=pmin(a,b), b=pmax(a,b))
   a  b
1  0  1
2  0  2
3  0  3
4  0  4
5  0  5
6  0  6
7  0  7
8  0  8
9  0  9
10 0 10
11 0  1
12 1 11
13 1 12
14 1 13
15 1 14
16 1 15
17 1 16
18 1 17
19 1 18
20 1 19
21 0  3

#mutate
libarary(dplyr)
x %>% mutate(a=pmin(a,b), b=pmax(a,b))
   a  b
1  0  1
2  0  2
3  0  3
4  0  4
5  0  5
6  0  6
7  0  7
8  0  8
9  0  9
10 0 10
11 0  0
12 1 11
13 1 12
14 1 13
15 1 14
16 1 15
17 1 16
18 1 17
19 1 18
20 1 19
21 0  0

请注意第 11 行和第 21 行的差异。我怀疑mutate 正在改变数据,因此pmax 看不到原始数据。它是否正确?这是一个错误,还是设计使然?

【问题讨论】:

  • 你说得对,这是设计使然(档案中有一些讨论,我忘了在哪里)。
  • @baptiste 谢谢,我想我现在明白为什么了:允许在同一命令中使用计算变量,因此需要明确引用原件。

标签: r dplyr


【解决方案1】:

看来我的怀疑是正确的,并且允许在之后立即使用计算变量是设计使然,例如:

data.frame(a=1:4,b=5:8) %>% mutate(sum=a+b, letter=letters[sum])
  a b sum letter
1 1 5   6      f
2 2 6   8      h
3 3 7  10      j
4 4 8  12      l

为了从transform 复制预期行为,只需直接引用变量即可:

x %>% mutate(a=pmin(x$a,x$b), b=pmax(x$a,x$b))
   a  b
1  0  1
2  0  2
3  0  3
4  0  4
5  0  5
6  0  6
7  0  7
8  0  8
9  0  9
10 0 10
11 0  1
12 1 11
13 1 12
14 1 13
15 1 14
16 1 15
17 1 16
18 1 17
19 1 18
20 1 19
21 0  3

【讨论】:

  • 没有明确提到 pminpmax,但您可以在 dplyr vignette 中了解此行为:dplyr::mutate() 的工作方式与 plyr::mutate() 相同,与 base::transform() 类似。 mutate()transform() 之间的主要区别在于 mutate 允许您引用刚刚创建的列 [示例中的 'a' 列]"
  • 能解释一下%>%的用法吗?
  • 是否有错字:“为了将预期行为从转换复制到需要”。你指的是变异,对吧?感谢您提醒这一差异。
  • @Anusha %&gt;% 是使用 magrittr 包的管道实现。我认为没有错字,我正在复制 mutate 中的变换行为。
  • 要复制转换的预期输出,您实际上可以只对第二个 x$a 使用 x$ 表示法,我认为它更清楚。
猜你喜欢
  • 2021-02-18
  • 2014-11-11
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2015-05-13
  • 1970-01-01
相关资源
最近更新 更多