2016-01-21 57 views
0

我有一個示例數據如下,我想通過sex來縮放x, y, z,並返回相同的數據結構。如何編寫代碼來實現它。我可以按組sex成功縮放一列而不是矩陣my.df。有人可以幫助我,提前感謝。 此外,如果我只是縮放矩陣my.df,而不是sexscale效果很好。如何按組縮放矩陣?

set.seed(2016) 
my.df <- data.frame(x=rnorm(100, mean=10), 
         y=rnorm(100, mean=33), 
         z=runif(100,1,300), 
         sex=sample(c("M","F"), 100, rep=T), 
         group=gl(5, 20, labels=LETTERS[1:5])) 

以下代碼完全不起作用。

library(plyr) 
ddply(my.df, .(sex), transform, scale) 
apply(my.df, 2, function(x) ddply(x, .(my.df$sex), scale(x))) 
apply(my.df[1:3], 2, function(x) tapply(x, my.df$sex, scale)) 
+1

我想你可以通過(my.df [C(試試這個'-4,-5 )],my.df $ sex,scale)'。 –

+0

對不起,它不適用於矩陣 –

回答

1

我們可以使用data.table。將'data.frame'轉換爲'data.table'(setDT(my.df),按'性別'分組,選擇感興趣的列.SDcols,我們遍歷列(lapply(.SD, ...),做scale並轉換爲vector。(scale功能輸出與某些屬性的矩陣,這會造成一些問題,如果我們不轉化爲vector。)

library(data.table) 
setDT(my.df)[, c('x', 'y', 'z') := lapply(.SD, function(x) 
      as.vector(scale(x))) , by = sex, .SDcols= x:z] 
+0

再次感謝@akrun它的工作原理。 –

+0

現在我有一個200列的矩陣,我應該如何修改代碼自動讀取c('x','y', 'z')和.SDcols = x:z。 @akrun –

+0

@TaoZhang你可以使用'names',即如果你想要縮放列'2:190',即'setDT(my.df)[,names(mydf)[2:190]:= lapply(。 SD,函數(x)as.vector(scale(x))),by = sex,.SDcols = 2:190]' – akrun