2013-10-13 73 views
1

我正在嘗試將一列添加到由歸一化值組成的數據框中。按比例向數據框添加比例列

例如:

'data.frame': 261 obs. of 3 variables: 
$ Area : Factor w/ 29 levels "Antrim","Ards",..: 1 1 1 1 1 1 1 1 1 2 ... 
$ Year : Factor w/ 9 levels "2002","2003",..: 1 2 3 4 5 6 7 8 9 1 ... 
$ Arrests: int 18 54 47 70 62 85 96 123 99 38 ... 

我想增加一列,是由地區團體歸逮捕值。

我想出的最好的是:

data$Arrests.norm <- unlist(unname(by(data$Arrests,data$Area,function(x){ scale(x)[,1] }))) 

此命令的過程,但數據是經過加密的,即標準化的值不匹配,在數據幀的正確的地方。

欣賞您的提示。

編輯:只是爲了澄清我的意思是亂碼數據,子集數據框後我的代碼我得到如下輸出,其中規範化的值顯然屬於另一個因素組。

 Area Year Arrests Arrests.norm 
199 Larne 2002  92 -0.992843957 
200 Larne 2003  124 -0.404975825 
201 Larne 2004  89 -1.169204397 
202 Larne 2005  94 -0.581336264 
203 Larne 2006  98 -0.228615385 
204 Larne 2007  8 0.006531868 
205 Larne 2008  31 0.418039561 
206 Larne 2009  25 0.947120880 
207 Larne 2010  22 2.005283518 

回答

2

跟進您的by嘗試:

df <- data.frame(A = factor(rep(c("a", "b"), each = 4)), 
       B = sample(1:4, 8, TRUE)) 

ll <- by(data = df, df$A, function(x){ 
    x$B_scale <- scale(x$B) 
    x 
    } 
    ) 

df2 <- do.call(rbind, ll) 
+0

df2是一個雙矩陣?當我將它分配給數據框時,與我的編輯中的錯配相同。 – JMcClure

+0

不,df2對應於您的最終數據幀。無需「分配」它。運行'str(df2)'。因爲你沒有提供[最小的,可重現的數據集](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610),我做了舉一個小例子。 – Henrik

+0

對,在函數中錯過了一個任性的'x'。非常感謝。 – JMcClure

2
data <- transform(data, Arrests.norm = ave(Arrests, Area, FUN = scale)) 

會做的伎倆。

+0

這產生了我在混合數據時遇到的相同問題。例如'子集(數據,數據$ Area ==「Larne」)'產生不匹配的數據,例如'Newtownabbey1 Larne 2002 92 -0.992843957' – JMcClure

+0

@JonMac對,我修改了答案。現在,訂單是正確的。 –