if else功能R.

时间:2018-03-22 14:50:53

标签: r if-statement

问候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")

3 个答案:

答案 0 :(得分:1)

默认情况下,您对base ifelse的使用未进行矢量化,因此会显示警告消息。但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

您可以为每个数字组合继续此操作,而不是键入,因为我认为这一点已经完成。如果您有任何疑问,请告诉我。