Как сгенерировать z-оценки отдельно для каждого факторного уровня, используя al oop в R? - PullRequest
2 голосов
/ 11 января 2020

Я хотел бы конвертировать variable в z-оценки. Как это сделать для каждого фактора cell уровня отдельно, используя al oop?

Пример DATA:

df = data.frame(Cell = c(rep("13a",5),rep("1b",5),rep("5b",5)),
            condition = rep(c("a","b","c","d","e"),3),
            variable = c(58,55,36,29,53,57,53,54,52,52,45,49,48,46,45))

Это хорошее начало? ... Может быть, l oop не обязательно покупать? Я хотел бы научиться писать циклы ...

# Final data frame containing the results of all loops
df_z = data.frame() 

# Loop through by cell
for (i in 1:unique(df$Cell)) {
df_z$myZ <-  scale(variable)
}

Ответы [ 2 ]

4 голосов
/ 11 января 2020

Это можно сделать с помощью операции group_by

library(dplyr)
df %>% 
   group_by(Cell) %>% 
   mutate(myZ = as.numeric(scale(variable)))

или с помощью data.table

library(data.table)
setDT(df)[, myZ := as.numeric(scale(variable)), by = Cell][]

В случае for l oop мы можем установить подстановку в каждой из итераций и присвоить значения scale d созданной переменной 'myZ'

un1 <- unique(df$Cell)
df$myZ <- NA
for(un in un1) {
     i1 <- df$Cell == un
     df$myZ[i1] <- as.numeric(scale(df$variable[i1]))
  }

или с помощью split

df$myZ <- unsplit(lapply(split(df$variable, df$Cell), scale), df$Cell)
2 голосов
/ 11 января 2020

Мы можем использовать ave в базе R:

df$myZ <- with(df, ave(variable, Cell, FUN = scale))
df
#   Cell condition variable    myZ
#1   13a         a       58  0.917
#2   13a         b       55  0.684
#3   13a         c       36 -0.792
#4   13a         d       29 -1.336
#5   13a         e       53  0.528
#6    1b         a       57  1.640
#7    1b         b       53 -0.289
#8    1b         c       54  0.193
#9    1b         d       52 -0.772
#10   1b         e       52 -0.772
#11   5b         a       45 -0.881
#12   5b         b       49  1.321
#13   5b         c       48  0.771
#14   5b         d       46 -0.330
#15   5b         e       45 -0.881
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...