для и если l oop для добавления факторов на основе нескольких стандартов заканчивается только последним кластером - PullRequest
0 голосов
/ 10 июля 2020

У меня есть такой фрейм данных:

df1 <- data.frame(
  E11 = c(2, 4, 6, 8), 
  E14 = c(3, 5, 7, 9), 
  E18 = c(3, 3, 3, 3), 
  Adult = c(9, 7, 5, 3), 
  E14vsE11 = c(1, 1, 1, 1), 
  E18vsE14 = c(0, -2, -4, -6), 
  AdultvsE18 = c(6, 4, 2, 0)), 
  row.names = c("geneA", "geneB", "geneC", "geneD")
)

Я хочу добавить к ним факторы кластера на основе значений сравнения, и мой код:

filtera <- df1$E14vsE11 >0 & df1$E18vsE14 >0 & df1$AdultvsE18 >0
filterb <- df1$E14vsE11 <0 & df1$E18vsE14 <0 & df1$AdultvsE18 <0
filterc <- df1$E14vsE11 ==0 & df1$E18vsE14 ==0 & df1$AdultvsE18 ==0
for (i in (1:nrow(df1))){
  if (isTRUE(filtera)){
    df1$cluster <- "cluster1"
  } else if (isTRUE(filterb)){ 
    df1$cluster <- "cluster2"
  } else if (isTRUE(filterc)){
    df1$cluster <- "cluster3"
  } else {
    df1$cluster <- "cluster4"
  }}

Но на выходе все были заполнены "cluster4". Как мне изменить код, чтобы он был правильным

1 Ответ

0 голосов
/ 10 июля 2020

Обратите внимание, что if() не является векторизованной функцией. isTrue как бы скрывает тот факт, что вы передаете вектор. Когда вы выполняете задание типа df1$cluster <- "cluster4", R не знает, какую строку вы пытаетесь обновить, поэтому он выполняет их все.

Более современный подход - использовать бит fo dplyr и case_when заявление о реклассификации.

library(dplyr)
df1 %>% 
  mutate(cluster = case_when(
    E14vsE11 >0 & E18vsE14 >0 & AdultvsE18 >0 ~ "cluster1",
    E14vsE11 <0 & E18vsE14 <0 & AdultvsE18 <0 ~ "cluster2",
    E14vsE11 ==0 & E18vsE14 ==0 & AdultvsE18 ==0 ~ "cluster3",
    TRUE ~ "cluster4"
  ))
...