#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")))