R按变量缩放并重新组合到数据帧

时间:2015-08-18 15:52:17

标签: r

我试图通过变量标准化数据框(几个变量,例如2)并重新组合数据框:

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)

我需要按Size1标准化。

我尝试了split-apply-combine方法

分割

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

应用

app<-sapply(splitby,scale)

这是我尝试重新组合的问题。输出是列表,我需要与原始格式相同的数据帧。我尝试了tapply / by / with在其中产生类似的列表。

1 个答案:

答案 0 :(得分:2)

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

使用dplyr,我们按&#39; Size1&#39;分组并在funs

中的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

或者我们可以使用data.table。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)),按&#39; Size1&#39;分组,我们遍历列(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

或者我们splitdata.frame加入listscale列,使用lapplyunsplit使用相同的变量& #39;尺寸1&#39;并指定输出以用scale d输出替换前两列。

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