繁体   English   中英

Ifelse() 在 R 中具有三个条件

[英]Ifelse() with three conditions in R

我有以下数据:

    RNA$MMP2
 [1]  1.506000000  0.957833333  2.285500000 -0.089333333 -1.233166667
 [6]  1.591500000 -1.396500000 -0.260500000  0.583000000 -0.716333333
[11]  1.628833333 -0.390000000 -0.466166667 -0.550666667  1.001666667
[16]  1.399000000 -0.454500000 -0.492833333  0.695166667  0.397666667  

如果我要根据某个阈值(例如 1.0)用字符变量替换这些数字变量,我会实现以下内容:

ifelse(RNA$MMP2 <= 1.0 ,"low","high")->x

如果我需要将字符变量分类为三个怎么办:

a) RNA$MMP2 < 0.5 ,"low"; 

b) RNA$MMP2 > 0.5 and < 1.0, "medium";

c) RNA$MMP2 > 1.0, "high";

建议将不胜感激。

一个选项将被cut以在多种情况下执行此操作

cut(RNA$MMP2, breaks = c(-Inf, 0.5, 1.0, Inf), 
        labels = c("low", "medium", "high"))

如果有两个以上的组,则需要嵌套ifelse

with(RNA, ifelse(MMP2 < 0.5, "low", 
          ifelse(MMP2 >= 0.5 & MMP2 < 1.0, "medium", "high")) 

dplyrcase_when()是这些类型案例的绝佳替代方案:

library(dplyr)

RNA %>% mutate(MMP2 = case_when(
  MMP2 < 0.5 ~ "low",
  MMP2 > 0.5 & MMP2 < 1 ~ "medium",
  MMP2 > 1 ~ "high"
))

这是一个基于findInterval的解决方案。

c("low", "medium", "high")[findInterval(RNA$MMP2, c(-Inf, 0.5, 1, Inf))]

测试

已经有几个答案了,这里是比较性能测试。 其他帖子是akrun ,有两个解决方案和juljo

Rui <- function(){
  c("low", "medium", "high")[findInterval(RNA$MMP2, c(-Inf, 0.5, 1, Inf))]
}

akrun1 <- function(){
  cut(RNA$MMP2, breaks = c(-Inf, 0.5, 1.0, Inf), 
      labels = c("low", "medium", "high"))
}

akrun2 <- function(){
  with(RNA, ifelse(MMP2 < 0.5, "low", 
                   ifelse(MMP2 >= 0.5 & MMP2 < 1.0, "medium", "high")))
}

library(dplyr)
juljo <- function(){
  RNA %>% mutate(MMP2 = case_when(
    MMP2 < 0.5 ~ "low",
    MMP2 > 0.5 & MMP2 < 1 ~ "medium",
    MMP2 > 1 ~ "high"
  ))
}

library(microbenchmark)
mb <- microbenchmark(
  Rui = Rui(), 
  akrun1 = akrun1(),
  akrun2 = akrun2(),
  juljo = juljo()
)
print(mb, unit = "relative", order = "median")
#Unit: relative
#   expr        min         lq      mean     median         uq      max neval cld
#    Rui   1.000000   1.000000  1.000000   1.000000   1.000000 1.000000   100  a 
# akrun2   5.173591   4.077107  2.148212   2.874767   3.117478 1.701425   100  a 
# akrun1  13.333069  10.033994  3.435633   8.305631   8.079830 1.017586   100  a 
#  juljo 235.851969 232.672643 50.541489 146.773911 142.042876 2.147924   100   b
  

数据

MMP2 <- scan(text = '  
1.506000000  0.957833333  2.285500000 -0.089333333 -1.233166667
1.591500000 -1.396500000 -0.260500000  0.583000000 -0.716333333
1.628833333 -0.390000000 -0.466166667 -0.550666667  1.001666667
1.399000000 -0.454500000 -0.492833333  0.695166667  0.397666667
')
RNA <- data.frame(MMP2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM