根据 R 数据框中其他列的值缩放列的有效方法
Efficient way of scaling column based on value in other column in R dataframe
我想根据另一列中的值缩放 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)
然后将 d 中的 x 值替换为缩放后的值,类似地 x
值替换为 y=2
。
到目前为止我所做的有点笨拙:
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_by
和 mutate
轻松做到这一点:
require(dplyr)
d %>%
group_by(y) %>%
mutate(x = (x - mean(x)) / sd(x))
此任务通常由 group by
在 dplyr
中使用 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]
我想根据另一列中的值缩放 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)
然后将 d 中的 x 值替换为缩放后的值,类似地 x
值替换为 y=2
。
到目前为止我所做的有点笨拙:
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_by
和 mutate
轻松做到这一点:
require(dplyr)
d %>%
group_by(y) %>%
mutate(x = (x - mean(x)) / sd(x))
此任务通常由 group by
在 dplyr
中使用 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]