阅读this优秀帖子,我遇到了within
和transform
。
阅读这两个帮助文件我不幸地没有完全理解差异是什么......
我尝试过类似的事情:
df <- data.frame(A = runif(5), B = rnorm(5))
A=1:5
within(df, C<-A+B)
transform(df,C=A+B)
两次输出都是:
A B C
1 0.2326266 1.3237210 1.5563476
2 0.4581693 -0.2605674 0.1976018
3 0.6431078 0.5920021 1.2351099
4 0.9682578 1.1964012 2.1646590
5 0.9889942 0.5468008 1.5357950
所以两者似乎都在创建一个新的环境,因为他们在评估中忽略了A=1:5
。
提前致谢!
答案 0 :(得分:13)
within
允许您稍后使用先前定义的变量,但不能使用transform
:
within(BOD, { a <- demand; b <- a }) # ok
transform(BOD, a = demand, b = a) # error
请注意,我定义了transform
的变体,其行为更像within
多年前here,其中称为my.transform
。使用它我们可以像这样编写上面的内容:
my.transform(BOD, a = demand, b = a) # ok
在上面的例子within
(或my.transform
)会更好,但在下面transform
更好:
transform(BOD, Time = demand, demand = Time) # swap columns
within(BOD, { Time <- demand; demand <- Time }) # oops
(要与within
执行交换,我们需要定义一个临时的。)
my.transform
现在位于gsubfn CRAN包中,称为transform2
。 dplyr中的mutate
从左到右工作。
请注意,transform
,transform2
和mutate
各自的工作方式略有不同。 RHS transform
参数都是指原始值。 mutate
参数的RHS指的是最近的从左到右的值。 transform2
计算出依赖关系并使用它们,以便依赖关系可以在它使用的参数之前或之后出现。