/ / Maneira eficiente de escalar a coluna com base no valor em outra coluna no dataframe R - r, dataframe, scale

Modo eficiente de escalar coluna baseado em valor em outra coluna em R dataframe - r, dataframe, escala

Eu quero escalar valores na coluna de um dataframe com base em valores em outra coluna. Por exemplo, aqui está um exemplo simples

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

dá a saída:

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

Eu quero escalar os valores x com base nos valores y, então o que eu quero é ter:

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

substitua os valores x em d pelos valores escalados, da mesma forma para o x valores com y=2.

O que fiz até agora é um pouco desajeitado:

     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)

e depois vincular todos os resultados em um grande quadro de dados, mas isso é um pouco tedioso, pois meus dados reais têm 50 valores diferentes para y e eu gostaria de fazer isso para várias colunas (diferentes).

Respostas:

2 para resposta № 1

Você pode facilmente fazer isso usando group_by e mutate de dplyr pacote:

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

1 para resposta № 2

Essa tarefa geralmente é executada por group by dentro dplyr e usando scale

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

0 para resposta № 3

Podemos usar data.table. Nós convertemos o "data.frame" em "data.table" (setDT(d)), agrupados por "b", atribua (:=) a scale de "x" a "x2".

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