Как классифицировать числовые диапазоны в r

#r #categories

#r #Категории

Вопрос:

У меня есть фрейм данных, где каждый столбец соответствует идентификатору пациента, а каждая строка соответствует определенному значению гена.

 df <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
                           "NRAS"),
                  A183=c(-0.19,NA,2.01,0.4,1.23),
                  A185=c(0.11,2.45,NA,NA,1.67),
                  A186=c(1.19,NA,2.41,0.78,1.93),
                  A187=c(2.78,NA,NA,0.7,2.23),
                  A188=c(NA,NA,NA,2.4,1.23))
head(df)

  Hugo_Symbol  A183 A185 A186 A187 A188
1      CDKN2A -0.19 0.11 1.19 2.78   NA
2         JUN    NA 2.45   NA   NA   NA
3        IRS2  2.01   NA 2.41   NA   NA
4        MTOR  0.40   NA 0.78 0.70 2.40
5        NRAS  1.23 1.67 1.93 2.23 1.23
 

Я хотел бы присвоить следующие категории для каждого значения:

  • если значению в диапазоне (-Inf, -2) присвоить категорию «1»,
  • если значению в диапазоне (-2, 2) присвоить категорию «2»
  • если значению в диапазоне (2,Inf) присвоить категорию «3»,
  • если значение равно NA, присвоите категории «0».

Я попытался использовать cut функцию для этого. Мой код выглядит примерно так:

 df2<- df[cut(df,
             breaks=c(-Inf,-2,2,Inf),
             labels=c("1","2","3"))]
 

Однако я получил следующую ошибку:

Ошибка в вырезании.по умолчанию (df, разрывы = c(-Inf, -2, 2, Inf), метки = c(«1», : ‘x’ должно быть числовым

Я полагаю, это потому, что у меня в таблице есть значения NA. Я не знаю, как присвоить категорию «0» для значений NA. Желаемый результат должен выглядеть следующим образом:

 Hugo_Symbol A183 A185 A186 A187 A188
1      CDKN2A    2    2    2    1    0
2         JUN    0    1    0    0    0
3        IRS2    1    0    1    0    0
4        MTOR    2    0    2    2    1
5        NRAS    2    2    2    1    2
 

Как я могу исправить эту ошибку и заменить каждое значение предопределенной категорией, о которой я упоминал выше?

Спасибо вам за вашу помощь!

Olha

Комментарии:

1. Пожалуйста, включите образец ваших данных в текст вашего вопроса, а не в качестве ссылки. Хорошим способом сделать это было бы включить выходные данные running dput(df[1:5,1:5]) , чтобы у нас была крошечная выборка данных размером 5×5 для работы.

2. df это весь фрейм данных. У него есть только один столбец или что-то в этом роде? В противном случае вам необходимо указать столбец, который вы хотите преобразовать. И я не уверен, когда вы используете [] здесь индекс to. Важно различать преобразование самого data.frame и столбца в data.frame. Но cut() это правильная функция для использования здесь.

3. Я хочу преобразовать сам data.frame. Я добавил игрушечный пример для своего стола.

Ответ №1:

Мы можем использовать findInterval в base R

 df[-1] <- lapply(df[-1], findInterval, c(-Inf, -2, 2, Inf))
 

Ответ №2:

У вас есть правильный код, но вам нужно применить его для каждого столбца. Вы можете сделать это через lapply in base R :

 df[-1] <- lapply(df[-1], cut, c(-Inf,-2,2,Inf), c("1","2","3"))
df

#  Hugo_Symbol A183 A185 A186 A187 A188
#1      CDKN2A    2    2    2    3 <NA>
#2         JUN <NA>    3 <NA> <NA> <NA>
#3        IRS2    3 <NA>    3 <NA> <NA>
#4        MTOR    2 <NA>    2    2    3
#5        NRAS    2    2    2    3    2
 

Или использовать across в dplyr :

 library(dplyr)

df %>% mutate(across(starts_with('A'), cut, c(-Inf,-2,2,Inf),c("1","2","3")))