根据组缩放所有值

时间:2017-01-20 10:11:04

标签: r scale tapply

我有一个与此类似的数据框

ID <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
p1 <- c(21000, 23400, 26800, 2345, 23464, 34563, 456433, 56543, 34543,3524, 353, 3432, 4542, 6343, 4534 )
p2 <- c(234235, 2342342, 32, 23432, 23423, 2342342, 34, 2343, 23434, 23434, 34, 234, 2343, 34, 5)
my.df <- data.frame(ID, p1, p2)

现在我想根据ID 缩放p1和p2 中的值。因此,不是像使用tapply()函数那样缩放整列,而是对ID 1的所有值进行一次缩放,然后对ID 2的所有值进行缩放等。对于p2的缩放也是如此。新数据框应包含缩放值。

我已经尝试了

df_scaled <- ddply(my.df, my.df$ID, scale(my.df$p1))

但是收到错误消息

.fun is not a function.

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

dplyr让这一切变得简单:

ID <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
p1 <- c(21000, 23400, 26800, 2345, 23464, 34563, 456433, 56543, 34543,3524, 353, 3432, 4542, 6343, 4534 )
p2 <- c(234235, 2342342, 32, 23432, 23423, 2342342, 34, 2343, 23434, 23434, 34, 234, 2343, 34, 5)
my.df <- data.frame(ID, p1, p2)

library(dplyr)
df_scaled <- my.df %>% group_by(ID) %>% mutate(p1 = scale(p1), p2=scale(p2))

请注意,使用scale时,稳定版dplyr中存在错误;您可能需要更新到开发版本(请参阅注释)。