#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