基于R数据帧中其他列的值缩放列的有效方式



我想根据另一列中的值缩放dataframe列中的数值。例如,这里有一个简单的示例

d<-data.frame(x=runif(5,0,10),y=sample(c(1,2),size=5,replace=TRUE))

给出输出:

         x  y
1 1.0895865 2
2 0.8261554 2
3 5.3503761 2
4 3.3940759 1
5 6.2786637 1

我想根据y值缩放x值,所以我想要的是:

(x|y=1 - average(x's | y=1))/std.dev(x's|y=1)

则类似地对于具有y=2x值用缩放后的值替换d中的x值。

到目前为止,我所做的有点笨拙:

     d1<-subset(d,y==1)
d2<-subset(d,y==2)
d1$x<-(d1$x-mean(d1$x))/sd(d1$x)
d2$x<-(d2$x-mean(d2$x))/sd(d2$x)

然后将所有结果绑定到一个大数据帧中,但这有点乏味,因为我的实际数据有50个不同的y值,我想对多个(不同的)列这样做。

您可以使用dplyr包中的group_bymutate轻松完成此操作:

require(dplyr)
d %>% 
  group_by(y) %>% 
  mutate(x = (x - mean(x)) / sd(x))

此任务通常由dplyr中的group by和使用scale 执行

 library(dplyr)
 d %>% group_by(y) %>% mutate(x2=scale(x))

我们可以使用data.table。我们将"data.frame"转换为"data.table"(setDT(d)),按"b"分组,将"x"的scale赋值(:=)为"x2"。

 setDT(d)[, x2 := scale(x) , by = y]

最新更新