если еще функция R

88
4

Приветствия R profesionales,

Имея много проблем с использованием функции if в R, любая помощь будет принята с благодарностью.

Я пытаюсь добавить еще один столбец в фрейм данных "p5", каждый номер в столбце "позиция" представляет собой одну мутацию в хромосоме, я хочу, чтобы новый столбец отображал функциональные домены мутаций, то есть "Z-диск",, 'I-band и т.д. Я пробовал несколько вариантов кода и продолжаю получать эту ошибку:

условие имеет длину> 1, и будет использоваться только первый элемент

p5$Functional.Domain <- if (p5$position < 179400576) {
as.character("M-Band")
}
else if (p5$position < 179483218) {
as.character("A-Band")
}
else if (p5$position < 179639929) {
as.character("I-Band")
}
else {
as.character("Z-disk")
}

dput():

structure(list(p4.position = c(179395822, 179400405, 179401029, 
179403522, 179403566, 179404286, 179404491, 179406990, 179408239,
179410544, 179410799, 179411339, 179412245, 179412902, 179413187,
179414153, 179414506, 179416474, 179416530, 179416531, 179417723,
179418418, 179419765, 179422231, 179422249, 179422457, 179422725,
179423314, 179424036, 179424398, 179424496, 179424782, 179425091,
179426073, 179426074, 179427963, 179428086, 179428871, 179429468,
179429849, 179430371, 179430544, 179432420, 179433213, 179433407,
179433665, 179433758, 179434009, 179435468, 179438874, 179440067,
179440319, 179441015, 179441649, 179441870, 179442238, 179442324,
179442793, 179443339, 179444429, 179444661, 179452242, 179452411,
179452435, 179453427, 179454576, 179454957, 179455112, 179455162,
179456704, 179457005, 179457392, 179458075, 179458085, 179462634,
179463684, 179466263, 179469477, 179469738, 179470359, 179471841,
179472127, 179472155, 179472209, 179477004, 179477169, 179477885,
179478861, 179478864, 179481600, 179485012, 179485829, 179487411,
179497039, 179497076, 179498055, 179506963, 179558736, 179591957,
179604264, 179605063, 179605941, 179632576, 179634455, 179644174,
179658189, 179658211)), .Names = "p4.position", row.names = c(NA,
-107L), class = "data.frame")

спросил(а) 2021-01-25T16:51:04+03:00 4 месяца, 4 недели назад
1
Решение
63

Не используйте, если такие утверждения. R имеет очень простой способ настройки такого типа.

С базой R:

p5$functional.domain<- "Z-disk" #making everything in this 
#column a z disk since you
#have it as the final else

p5$functional.domain[p5$position < 179483218] <- "A-band"

... # Continue for all other combinations

Вы можете продолжить это для каждой комбинации чисел, а не печатать, поскольку я думаю, что точка сделана. Дайте мне знать, если у вас есть quesitons.

ответил(а) 2021-01-25T16:51:04+03:00 4 месяца, 4 недели назад
63

Ваше использование базы if и else по умолчанию не имеет векторизации, поэтому появляется предупреждающее сообщение. Но функция ifelse векторизована, и это будет один из вариантов. Однако библиотека dplyr предлагает очень case_when функцию case_when:

library(dplyr)

p5$Functional.Domain <- case_when(
p5$position < 179400576 ~ "M-Band",
p5$position < 179483218 ~ "A-Band",
p5$position < 179639929 ~ "I-Band"
TRUE ~ "Z-disk"
)

ответил(а) 2021-01-25T16:51:04+03:00 4 месяца, 4 недели назад
63

Используйте dplyr::mutate() чтобы добавить новую переменную с case_when() для обработки условных операторов:

p5 <- p5 %>%
dplyr::mutate(Functional.Domain = case_when(
position < 179400576 ~ as.character('M-Band'),
position < 179483218 ~ as.character('A-Band'),
position < 179639929 ~ as.character('I-Band'),
TRUE ~ as.character('Z-disk')))

ответил(а) 2021-01-25T16:51:04+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема