2014-01-30 72 views
0

我有一個數據幀m與正常變換函數:自動化中的R在多個列

>m 

id w y z 
1 2 5 8 
2 18 5 98 
3 1 25 5 
4 52 25 8 
5 5 5 4 
6 3 3 5 

下面是用於正常地轉化變量一般功能,我需要適用於列W,Y,Z 。

y<-qnorm((rank(x,na.last="keep")-0.5)/sum(!is.na(x)) 

例如,如果我想在「列W」運行這個函數來獲得附加到數據幀「M」,則輸出列:

m$w_n<-qnorm((rank(m$w,na.last="keep")-0.5)/sum(!is.na(m$w)) 

有人可以幫我自動完成這一運行在數據框m中的多列上? 理想情況下,我想用下面列的輸出數據幀:

id w y z w_n y_n z_n 

注意這是一個樣本數據幀,一個我大得多,我有更多的字母列上運行比其他此功能w,y,z。 謝謝!

+2

創建新變量與'_n'後綴的方式繁瑣。如果我是你,我會創建一個全新的data.frame,其中包含相同的變量名稱,即停在'sapply(df [-1],transCols)'在matt_k的答案中。這就是你要給這個新數據框架的名稱,它將捕捉它變量的性質/含義,例如, '轉化.vars < - sapply(...)'。 – flodel

回答

2

可能是一個辦法做到這一點在一個單一的步驟,但怎麼樣:

df <- data.frame(id = 1:6, w = sample(50, 6), z = sample(50, 6)) 

df 
    id w z 
1 1 39 40 
2 2 20 26 
3 3 43 11 
4 4 4 37 
5 5 36 24 
6 6 27 14 

transCols <- function(x) qnorm((rank(x,na.last="keep")-0.5)/sum(!is.na(x))) 
tmpdf <- lapply(df[, -1], transCols) 
names(tmpdf) <- paste0(names(tmpdf), "_n") 
df_final <- cbind(df, tmpdf) 
df_final 

df_final 
    id w z  w_n  z_n 
1 1 39 40 -0.2104284 -1.3829941 
2 2 20 26 1.3829941 1.3829941 
3 3 43 11 0.2104284 0.6744898 
4 4 4 37 -1.3829941 0.2104284 
5 5 36 24 0.6744898 -0.6744898 
6 6 27 14 -0.6744898 -0.2104284