внутригрупповое вычисление данных. кадр в R

#r

#r

Вопрос:

В моем input data.frame df.in я хотел бы добавить столбец группы, который должен быть либо высоким, либо низким, на основе следующих критериев: Высокий: если медиана Expression внутри каждого Patient из них выше 0 Низкий: если медиана Expression внутри каждого Patient равна 0

Моя проблема в том, как определить, что медиана должна быть рассчитана в пределах Patient

df.in

   Expression    Cell Patient
       0.00 MM02_48    MM01
       3.00 MM02_50    MM01
       1.00 MM02_51    MM02
       1.79  MM02_5    MM02
       0.00 MM02_61    MM03
       0.00 MM02_72    MM03
  

df.out

   Expression    Cell Patient Group
       0.00 MM02_48    MM01 High
       3.00 MM02_50    MM01 High
       1.00 MM02_51    MM02 High
       1.79  MM02_5    MM02 High
       0.00 MM02_61    MM03 Low
       0.00 MM02_72    MM03 Low
  

Ответ №1:

Вы могли бы попробовать dplyr .

Вы можете использовать group_by для вычисления медианы по пациентам и использовать ifelse оператор and mutate для присвоения High или Low на основе медианного значения выражения.

 library(dplyr)

Expression <- c(0.00, 3.00, 1.00, 1.79, 0.00, 0.00)
Cell <- c("MM02_48", "MM02_50", "MM02_51", "MM02_5", "MM02_61", "MM02_72")
Patient <- c("MM01", "MM01", "MM02", "MM02", "MM03", "MM03")


df <- as_tibble(cbind(Expression, Cell, Patient))
df$Expression <- as.numeric(Expression)

df %>% group_by(Patient) %>% mutate(Group = ifelse(median(Expression) >= 1, "High", "Low"))

      Expression Cell    Patient Group
         <dbl>   <chr>  <chr>   <chr>
    1       0    MM02_48 MM01    High 
    2       3    MM02_50 MM01    High 
    3       1    MM02_51 MM02    High 
    4       1.79 MM02_5  MM02    High 
    5       0    MM02_61 MM03    Low  
    6       0    MM02_72 MM03    Low  
  

Ответ №2:

Я предлагаю вам взглянуть на то, как использовать data.table , это очень полезно для такого рода операций.

В вашем случае это может быть сделано следующим образом :

 library(data.table)

# make dummy data
x <- data.frame(expr = rnorm(20), pat = rep(letters[1:5], each=4))
x <- as.data.table(x)

x[, ("group"):= ifelse(median(expr) > 0, "high", "low"), pat]
x
  

data.table использует DT[i, j, by] схему.

("group"):=... s ‘j’ и определяет новый столбец из следующего выражения.

,pat] указывает, что выражение вычисляется на каждом уровне pat