是否可以引用transform
中的其他变量?
例如:
Data = transform(Data,
m = x,
d = m,
c = m * 2
)
答案 0 :(得分:5)
以下是一些解决方案。为了重现性,我们将假设Data
的这个定义:
Data <- data.frame(x = 1)
1)迭代变换尝试迭代变换:
transform(transform(Data, m = x), d = m, c = m*2)
2)或使用within
:
within(Data, { m <- x; d <- m; c <- m*2 })
3)my.transform 还有一个支持此类行为的替代定义here。
my.transform(Data, m = x, d = m, c = m*2)
请注意,这是唯一支持不按顺序设置变量的答案,例如
my.transform(Data, d = m, c = m*2, m = x)
4)dplyr包中的dplyr :: mutate mutate
也支持:
library(dplyr)
mutate(Data, m = x, d = m, c = m*2)
答案 1 :(得分:1)
不,如果您指的是在当前 transform()
来电中创建的变量:
df <- data.frame(x = 1:10)
df2 <- transform(df, m = x, d = m, c = m * 2)
> df <- data.frame(x = 1:10)
> df2 <- transform(df, m = x, d = m, c = m * 2)
Error in eval(expr, envir, enclos) : object 'm' not found
显而易见的解决方案是进行两次transform()
次呼叫:
df2 <- transform(df, m = x)
df2 <- transform(df2, d = m, c = m * 2)
head(df2)
> head(df2)
x m d c
1 1 1 1 2
2 2 2 2 4
3 3 3 3 6
4 4 4 4 8
5 5 5 5 10
6 6 6 6 12
或嵌套
df3 <- transform(transform(df, m = x), d = m, c = m * 2)
> head(df3)
x m d c
1 1 1 1 2
2 2 2 2 4
3 3 3 3 6
4 4 4 4 8
5 5 5 5 10
6 6 6 6 12
替代方案是within()
,它可以做你想要的但是对用户不太友好:
df4 <- within(df, {
m <- x
d <- m
c <- m * 2
})
> head(df4)
x c d m
1 1 2 1 1
2 2 4 2 2
3 3 6 3 3
4 4 8 4 4
5 5 10 5 5
6 6 12 6 6
这种情况的一个特质是你无法控制新变量的排序。
请注意,within()
有效,因为整个表达式({ ... }
中的内容)在包含df
中的变量的环境中进行评估。因此,m
在该环境中可用,因为它是在表达式的第一行中创建的。