如何在R中按列最佳地规范化数据框?

时间:2017-04-29 18:08:33

标签: r average normalization

我有一个类似下面的数据集,我希望按列进行标准化(0到1)。

我目前的情况:

        2015 Value      2014 Value      2013 Value
China           500             400             450
Germany         890             760             700
Italy           240             210             200

最终会有什么好处:

            2015 Value      2015 Normed     2014 Value      2014 Normed     2013 Value      2013 Normed
China           500             0.5             400             0.5             450             0.5
Germany         890             1.0             760             1.0             700             1.0
Italy           240             0.0             210             0.0             200             0.0

完成此步骤后,我希望将每个Normed列平均为"总平均值"。

我已尝试过几件事,但我没有看到如何按列为每个输出添加一个新列。 lapply函数似乎是正确的轨道,但我不确定如何最好地使用它。 (我是R试图学习的新人。)

我非常感谢你的帮助。对不起基本问题!

2 个答案:

答案 0 :(得分:2)

我们可以使用lapply循环列,进行规范化,cbind使用原始数据集列,或者使用Map,然后使用cbind list data.frame元素到lst <- lapply(df[-1], function(x) round((x-min(x))/(max(x)-min(x)), 1)) res <- cbind(df[1], do.call(cbind.data.frame, Map(cbind , df[-1], lst))) names(res)[-1] <- rbind(names(df)[-1], sub("Value", "Norm", names(df)[-1])) res # Country 2015 Value 2015 Norm 2014 Value 2014 Norm 2013 Value 2013 Norm #1 China 500 0.4 400 0.3 450 0.5 #2 Germany 890 1.0 760 1.0 700 1.0 #3 Italy 240 0.0 210 0.0 200 0.0

df <- structure(list(Country = c("China", "Germany", "Italy"), `2015 Value` = c(500L, 
890L, 240L), `2014 Value` = c(400L, 760L, 210L), `2013 Value` = c(450L, 
700L, 200L)), .Names = c("Country", "2015 Value", "2014 Value", 
"2013 Value"), class = "data.frame", row.names = c(NA, -3L))

数据

{{1}}

答案 1 :(得分:0)

如果从一个全数字值的数据框开始,则可以将其视为数组,并使用标准apply

data.df <- read.delim("data.tsv");
colnames(data.df) <- sub("^X","",colnames(data.df));

data.df[,sub("Value","Normed",colnames(data.df))] <-
    (apply(data.df,1,function(x){(x-min(x)) / diff(range(x))}));

> data.df
        2015.Value 2014.Value 2013.Value 2015.Normed 2014.Normed 2013.Normed
China          500        400        450         1.0   1.0000000        1.00
Germany        890        760        700         0.0   0.3157895        0.25
Italy          240        210        200         0.5   0.0000000        0.00