在尝试回答this question时,我遇到了mutate
和transform
之间的差异,我认为这是等同的操作。
# 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
没有看到原始数据。它是否正确?这是一个错误,还是设计?
答案 0 :(得分:3)
看来我的怀疑是正确的,并且在设计之后允许立即使用计算变量,例如:
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