在 'with' 调用中分配 data.frame 的列
Assigning column of data.frame in 'with' call
在调用 'with' 时,是否有一种优雅的方法来分配 data.frame 中的列。例如我想做这样的事情:
> df <- data.frame(x=runif(5), y=runif(5))
> df
x y
1 0.4010225 0.1702563
2 0.7204338 0.9929117
3 0.3755553 0.9229862
4 0.2959035 0.3947730
5 0.3273934 0.3680618
> with(df, y <- cumsum(x))
> df
x y
1 0.4010225 0.1702563
2 0.7204338 0.9929117
3 0.3755553 0.9229862
4 0.2959035 0.3947730
5 0.3273934 0.3680618
但最终df$y是df$x的累加和。我知道 df$y <- cumsum(df$x)
对于这样一个微不足道的例子来说效果很好,但是随着事情变得越来越复杂,使用上面的东西会更简单。有好的解决办法吗?
编辑以指定多列计算。
有没有什么方法可以从 within
进行多列计算而不必重述 data.frame 名称?例如
> df <- data.frame(a=runif(5), b=runif(5), c=runif(5))
> df
a b c
1 0.4470582 0.57788300 0.06578355
2 0.6694826 0.13988892 0.80460530
3 0.7300993 0.78663734 0.68503691
4 0.6825741 0.07943231 0.02903320
5 0.6384533 0.42809113 0.26117171
> within(df, { x <- cumsum(a); y <- rowSums(df[,1:2]) })
a b c y x
1 0.4470582 0.57788300 0.06578355 1.0249412 0.4470582
2 0.6694826 0.13988892 0.80460530 0.8093715 1.1165408
3 0.7300993 0.78663734 0.68503691 1.5167366 1.8466401
4 0.6825741 0.07943231 0.02903320 0.7620064 2.5292142
5 0.6384533 0.42809113 0.26117171 1.0665445 3.1676675
您可以使用 transform
或 within
。在这两种情况下,如果您希望它持续存在,您必须将结果分配回 df
。
> transform(df, y=cumsum(x))
x y
1 0.7430507 0.7430507
2 0.2858004 1.0288512
3 0.9565152 1.9853664
4 0.4379119 2.4232783
5 0.6885749 3.1118532
> within(df, y <- cumsum(x))
x y
1 0.7430507 0.7430507
2 0.2858004 1.0288512
3 0.9565152 1.9853664
4 0.4379119 2.4232783
5 0.6885749 3.1118532
这里是一个更复杂的例子,实际上修改了df
:
df <- within(df, {z <- x * 2; y <- cumsum(z); rm(z)})
请注意,我们 rm(z)
否则会向 df
添加另一列。
在调用 'with' 时,是否有一种优雅的方法来分配 data.frame 中的列。例如我想做这样的事情:
> df <- data.frame(x=runif(5), y=runif(5))
> df
x y
1 0.4010225 0.1702563
2 0.7204338 0.9929117
3 0.3755553 0.9229862
4 0.2959035 0.3947730
5 0.3273934 0.3680618
> with(df, y <- cumsum(x))
> df
x y
1 0.4010225 0.1702563
2 0.7204338 0.9929117
3 0.3755553 0.9229862
4 0.2959035 0.3947730
5 0.3273934 0.3680618
但最终df$y是df$x的累加和。我知道 df$y <- cumsum(df$x)
对于这样一个微不足道的例子来说效果很好,但是随着事情变得越来越复杂,使用上面的东西会更简单。有好的解决办法吗?
编辑以指定多列计算。
有没有什么方法可以从 within
进行多列计算而不必重述 data.frame 名称?例如
> df <- data.frame(a=runif(5), b=runif(5), c=runif(5))
> df
a b c
1 0.4470582 0.57788300 0.06578355
2 0.6694826 0.13988892 0.80460530
3 0.7300993 0.78663734 0.68503691
4 0.6825741 0.07943231 0.02903320
5 0.6384533 0.42809113 0.26117171
> within(df, { x <- cumsum(a); y <- rowSums(df[,1:2]) })
a b c y x
1 0.4470582 0.57788300 0.06578355 1.0249412 0.4470582
2 0.6694826 0.13988892 0.80460530 0.8093715 1.1165408
3 0.7300993 0.78663734 0.68503691 1.5167366 1.8466401
4 0.6825741 0.07943231 0.02903320 0.7620064 2.5292142
5 0.6384533 0.42809113 0.26117171 1.0665445 3.1676675
您可以使用 transform
或 within
。在这两种情况下,如果您希望它持续存在,您必须将结果分配回 df
。
> transform(df, y=cumsum(x))
x y
1 0.7430507 0.7430507
2 0.2858004 1.0288512
3 0.9565152 1.9853664
4 0.4379119 2.4232783
5 0.6885749 3.1118532
> within(df, y <- cumsum(x))
x y
1 0.7430507 0.7430507
2 0.2858004 1.0288512
3 0.9565152 1.9853664
4 0.4379119 2.4232783
5 0.6885749 3.1118532
这里是一个更复杂的例子,实际上修改了df
:
df <- within(df, {z <- x * 2; y <- cumsum(z); rm(z)})
请注意,我们 rm(z)
否则会向 df
添加另一列。