我有一个非常简单的数据框,它是这样的:
id ts val
A 2013-01-01 00:00:00 12
A 2013-01-01 00:00:00 543
B 2013-01-01 00:00:00 76
B 2013-01-01 00:00:00 76
A 2013-01-01 01:00:00 11
C 2013-01-01 01:00:00 42
C 2013-01-01 02:00:00 48
我想要做的是重新调整所有值,因此它们可以介于0和1之间,但是按ID进行分组。换句话说,我需要为每个id块计算min和max,然后通过取其值重新调整每一行,从min group值中减去并除以min-max。以R形式:
function rescale01 <- function(curr, min, max) {return (curr-min/max-min)}
我找到了一种从这个数据框中获取min和max的方法,但是太俗气了:
ddply(df[,c(1,3)], "tag", function(x){
y <- subset(x, select= -tag)
c(apply(y, 2, min), apply(y, 2, max))
})
你能建议一种更好的方法来实现我的需求吗?
谢谢!
答案 0 :(得分:2)
也许使用dplyr::mutate
:
> df <- data.frame( id = rep( c(1,2), each = 5 ), x = 1:10 )
> group_by(df, id) %>% mutate( x = ( x-min(x) ) / ( max(x) - min(x) ) )
Source: local data frame [10 x 2]
Groups: id
id x
1 1 0.00
2 1 0.25
3 1 0.50
4 1 0.75
5 1 1.00
6 2 0.00
7 2 0.25
8 2 0.50
9 2 0.75
10 2 1.00
答案 1 :(得分:1)
基本功能ave()
也可以正常使用(使用@ Romain的样本数据)
df <- data.frame( id = rep( c(1,2), each = 5 ), x = 1:10 )
df$rescaled <- with(df, ave(x, id, FUN=function(x) {(x-min(x))/(max(x)-min(x))}))
df;