如何创建基于条件标记行的列?

问题描述

在这里尝试使用类似问题的答案,但是在创建4个标签的列时遇到了问题。但是,当我尝试创建这些标签时,我制作的标签会重新标记我分配的第一个标签。例如,我想要创建一个label列,如下所示:

Gene   Feature1   Feature2   Feature3 ...  label
Gene1   1            3         1            most likely
Gene2   0            0         1            probable
Gene3   NA           NA        NA           unkNown
Gene4   0            0         0            unlikely

但是,我的数据很大,因此我的功能在这里不具有代表性,但是我要尝试获得4个标签。 我尝试使用以下代码进行编码:

df$label[(df$Mechanism == 1)|(df$med >= 3) |(df$OMIM == 1)] <- "most likely"

df$label[is.na(df$label) & (df$med <= 2 )|(df$SideeffectFreq>=1) |(df$MGI_Gene==1) |(df$model_Gene==1) |(df$Rank>=1) ] <- "probable"

df$label[(df$Causality == 'least likely')] <- "least likely"

df$label[is.na(df$label)] <- "unkNown"

当我在第一行运行以创建“最可能”的标签时,它会标记50个基因(这是我期望的),但是在第二行运行“可能”会重新标记一些“最可能”的基因只剩下其中的34个我以为使用is.na(df$label)(df$label != 'most likely')可以解决此问题,但都不能解决

是否有更好的方法来创建这样的标签列?我是编码的新手,所以如果有人可以解释为什么is.na(df$label)(df$label != 'most likely')不能按我预期的那样工作,那也会很有帮助。

编辑: 使用“最可能”标签的示例:

#Input data:
dput(dt)
structure(list(Gene = c("gene1","gene2","gene3","gene4"),F1 = c(1L,0L,1L),F2 = c(3L,F3 = c("1","1","least likely"),label = c(NA,NA,NA)),row.names = c(NA,-4L),class = c("data.table","data.frame"))

dt$label[(dt$F1 == 1)|(dt$F2 >= 3) |(dt$F1 == 1)] <- "most likely"
dt$label[(dt$label != 'most likely') & (dt$F1 == 2)|(dt$F2 == 0) |(dt$F1 == 1)] <- "probable"
dt$label[(dt$F1 == 0)|(dt$F2 == 0)] <- "unlikely"
dt$label[(dt$F3 == 'least likely')] <- "unkNown"

解决方法

您可以使用case_when或嵌套的ifelse语句,以便每一行仅基于它们的出现而满足一个条件。

library(dplyr)

dt %>%
  mutate(label = case_when(Mechanism == 1 | med >= 3 | OMIM == 1 ~ 'most likely',med <= 2 | ideeffectFreq >= 1 | MGI_Gene==1 | Rank>=1  ~ 'probable',#add more conditions
                 #if none of the conditions satisfy from above assign "unknown"
                 TRUE ~ 'unknown'))

如果您有data.table,则它的fcasecase_when类似:

library(data.table)
dt[,label := fcase( Mechanism == 1 | med >= 3 | OMIM == 1,'most likely',#more conditions
                     default = 'unknown')]