问候R profesionales,
在R中使用if函数时遇到很多麻烦,我们将非常感谢任何帮助。
我试图在'p5'数据框上添加另一个列,'position'列中的每个数字代表染色体中的一个突变,我希望新列显示突变的功能域,即'Z -disk','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")
答案 0 :(得分:1)
默认情况下,您对base if
和else
的使用未进行矢量化,因此会显示警告消息。但ifelse
函数是矢量化的,这将是一个选项。但是,dplyr
库提供了非常方便的函数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"
)
答案 1 :(得分:1)
使用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')))
答案 2 :(得分:1)
不要使用if语句。 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
您可以为每个数字组合继续此操作,而不是键入,因为我认为这一点已经完成。如果您有任何疑问,请告诉我。