2015-02-05 18 views
0

在'with'的調用中,是否有一種在data.frame中分配列的優雅方法。例如,我想要做這樣的事情:在'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 
+0

如果有疑問,請閱讀'?with'幫助頁面。你會發現'內部()'以及討論差異。 – MrFlick 2015-02-05 21:00:37

回答

2

您可以使用transformwithin。在這兩種情況下,您都必須將結果分配回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

+0

感謝@BrodieG,單列計算的好答案。我編輯了我的問題以指定多列計算,例如rowSums。 – 2015-02-05 21:25:22

+0

@CornedBeefHashMap,你應該考慮爲該問題提出一個單獨的問題。 – BrodieG 2015-02-05 21:41:25

相關問題