2014-06-11 48 views
1

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

例如:

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

什么是'Data','x'等在这里?一个简短的答案是:不,你不能在'transform'中引用'm' – gagolews

+1

为什么你不只是在样本数据上测试你的代码并得到你的答案?大卫阿伦堡 –

+0

,我做了,我无法弄清楚如何使它工作。 谢谢@gagolews,那是我正在寻找的答案。 – muyueh

回答

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.tra nsform还有一个支持这种行为的替代变换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也支持这一点:

library(dplyr) 
mutate(Data, m = x, d = m, c = m*2) 
+0

谢谢,这是一个相当完整的答案。 – muyueh

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

相关问题