是否有可能在`transform`中引用其他var?

时间:2014-06-11 15:03:32

标签: r

是否可以引用transform中的其他变量?

例如:

Data = transform(Data, 
              m = x,
              d = m,
              c = m * 2
)

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在该环境中可用,因为它是在表达式的第一行中创建的。