R中数据帧中的数据处理块

时间:2014-05-12 17:19:53

标签: r

我有一个非常简单的数据框,它是这样的:

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))
})

你能建议一种更好的方法来实现我的需求吗?

谢谢!

2 个答案:

答案 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;