`transform`和`within`之间有什么区别?

时间:2014-03-14 23:39:54

标签: r

阅读this优秀帖子,我遇到了withintransform

阅读这两个帮助文件我不幸地没有完全理解差异是什么......

我尝试过类似的事情:

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

提前致谢!

1 个答案:

答案 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从左到右工作。

请注意,transformtransform2mutate各自的工作方式略有不同。 RHS transform参数都是指原始值。 mutate参数的RHS指的是最近的从左到右的值。 transform2计算出依赖关系并使用它们,以便依赖关系可以在它使用的参数之前或之后出现。