2015-08-18 49 views
1

我試圖標準化由變量的數據幀(幾個變量,例如2英寸)和重組所述數據幀:R量表和重組以數據幀

V1<-c(1,2,3,4,5,6,2,3,1,2) 
V2<-c(.2,.4,.3,.5,.1,.3,.6,1,0,.5) 
Size1<-c("S","S","M","L","M","S","M","L","S","M") 
df<-data.frame(V1,V2,Size1) 
Size1<-factor(Size1) 

AllStand<-data.frame(sapply(df[,1:2],scale),Size1=df$Size1) 

我需要通過尺寸1標準化。

我試圖分裂申請-結合的方法

分裂

splitby<-split(df[,1:2],Size1) 

申請

app<-sapply(splitby,scale) 

而這裏就是我試圖重組它的一個問題。輸出是列表,我需要與原始格式相同的數據幀。我試着用/在/旁邊在步驟中產生類似的列表。

回答

2

我們可以使用聚合方法之一。

通過 '尺寸1' 使用dplyr,我們組和mutate_each

library(dplyr) 
df %>% 
    group_by(Size1) %>% 
    mutate_each(funs(scale)) 
#   V1   V2 Size1 
#1 -0.6301260 -0.1463850  S 
#2 -0.2100420 1.0246951  S 
#3 0.0000000 -0.3382407  M 
#4 0.7071068 -0.7071068  L 
#5 1.4142136 -1.2402159  M 
#6 1.4702941 0.4391550  S 
#7 -0.7071068 1.0147221  M 
#8 -0.7071068 0.7071068  L 
#9 -0.6301260 -1.3174651  S 
#10 -0.7071068 0.5637345  M 

指定funs裏面的函數或者我們可以使用data.table。我們將'data.frame'轉換爲'data.table'(setDT(df)),按'Size1'分組,我們遍歷列(lapply(.SD)和scale

library(data.table) 
setDT(df)[, lapply(.SD, function(x) as.numeric(scale(x))) , by = Size1] 
#  Size1   V1   V2 
# 1:  S -0.6301260 -0.1463850 
# 2:  S -0.2100420 1.0246951 
# 3:  S 1.4702941 0.4391550 
# 4:  S -0.6301260 -1.3174651 
# 5:  M 0.0000000 -0.3382407 
# 6:  M 1.4142136 -1.2402159 
# 7:  M -0.7071068 1.0147221 
# 8:  M -0.7071068 0.5637345 
# 9:  L 0.7071068 -0.7071068 
#10:  L -0.7071068 0.7071068 

或者,我們通過lapplyunsplit使用相同的變量「尺寸1」並分配輸出,以取代與scale d輸出的前兩列與循環splitdata.framelistscale的列。

df[,1:2] <- unsplit(lapply(split(df[,1:2], Size1), 
        function(x) as.data.frame(scale(x))), Size1) 
df 
#   V1   V2 Size1 
#1 -0.6301260 -0.1463850  S 
#2 -0.2100420 1.0246951  S 
#3 0.0000000 -0.3382407  M 
#4 0.7071068 -0.7071068  L 
#5 1.4142136 -1.2402159  M 
#6 1.4702941 0.4391550  S 
#7 -0.7071068 1.0147221  M 
#8 -0.7071068 0.7071068  L 
#9 -0.6301260 -1.3174651  S 
#10 -0.7071068 0.5637345  M 
+1

謝謝,@akrun。 dplyr選項是最優雅的。第三種選擇是我正在尋找的 –

+0

@KonstantinMingoulin感謝您的反饋。 – akrun