我有一个类似下面的数据集,我希望按列进行标准化(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试图学习的新人。)
我非常感谢你的帮助。对不起基本问题!
答案 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