如何在新数据集中的许多列应用缩放规则

时间:2017-07-15 14:46:19

标签: r scale

我有下一个任务

a = data.frame(a= c(1,2,3,4,5,6)) # dataset
range01 <- function(x){(x-min(a$a))/(max(a$a)-min(a$a))} # rule for scale
b = data.frame(a = 6) # newdaset
lapply(b$a, range01) # we can apply range01 for this dataset because we use min(a$a) in the rule

但是,当我的数据集中有很多列时,如何应用此功能?如下所示

a = data.frame(a= c(1,2,3,4,5,6))
b = data.frame(b= c(1,2,3,3,2,1))
c = data.frame(c= c(6,2,4,4,5,6))
df = cbind(a,b,c)
df
new = data.frame(a = 1, b = 2, c = 3)

当然,我可以为每个变量制定规则

range01a <- function(x){(x-min(df$a))/(max(df$a)-min(df$a))}

但是这很长。如何方便?

2 个答案:

答案 0 :(得分:1)

您可以重新定义缩放功能,因此需要两个参数;一个要缩放,一个缩放器如下,然后在两个数据帧上使用Map

scale_custom <- function(x, scaler) (x - min(scaler)) / (max(scaler) - min(scaler))

Map(scale_custom, new, df)
#$a
#[1] 0

#$b
#[1] 0.5

#$c
#[1] 0.25

如果您需要数据框:

as.data.frame(Map(scale_custom, new, df))
#  a   b    c
#1 0 0.5 0.25

答案 1 :(得分:1)

您可以利用newdf的列名相同的事实。如果两个数据帧中列的顺序不同,可能会有所帮助。

sapply(names(new), function(x) (new[x]-min(df[x]))/(max(df[x])-min(df[x])))
#$a.a
#[1] 0

#$b.b
#[1] 0.5

#$c.c
#[1] 0.25

放入data.frame

data.frame(lapply(names(new), function(x) (new[x]-min(df[x]))/(max(df[x])-min(df[x]))))
#  a   b    c
#1 0 0.5 0.25