如何在R中按列最好地对数据框进行归一化?

3
我有一个数据集,想按列将其归一化(从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

在这一步骤之后,我想要对每个归一化列进行平均并获得一个“总体平均值”。
我尝试了几种方法,但是我不知道如何通过每个输出的新列应用该函数。 lapply 函数似乎是正确的轨迹,但我不确定如何最好地使用它(我是一个学习R的新手)。
非常感谢您的帮助。对于这些基本问题,我很抱歉!

这些是虚构的值,但以下是将其标准化为0到1范围的方程式:(x - min(x))/(max(x) - min(x)) - Natasha R.
@akrun 嗯,当我尝试这样做时,我得到了这个错误:"二元运算符的非数字参数"。 - Natasha R.
在您的数据中,国家是一列还是只是行名称? - G5W
请检查 str(yourdata) 是否有非数字列 - akrun
@G5W:它们是独立的列。因此,第一列是“国家”,c2是“2015年价值”,等等。 - Natasha R.
显示剩余3条评论
2个回答

3

我们可以使用lapply循环遍历列,进行归一化,并使用Map将原始数据集列与其交替cbind,然后将list元素cbind到一个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))

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接