我试图通过变量标准化数据框(几个变量,例如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在其中产生类似的列表。
答案 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
或者我们split
将data.frame
加入list
,scale
列,使用lapply
,unsplit
使用相同的变量& #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