我有下一个任务
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))}
但是这很长。如何方便?
答案 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)
您可以利用new
和df
的列名相同的事实。如果两个数据帧中列的顺序不同,可能会有所帮助。
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