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 № 1Você 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]