【问题标题】:A for loop using a double conditional使用双重条件的 for 循环
【发布时间】:2021-08-18 22:04:17
【问题描述】:

我目前正在尝试创建一个双重条件,如果我的数据框“模型”的癌症类型(指示)和基因(基因)都出现在另一个名为“cpg”的数据框中,那么一个新列如果两个条件都满足,则在模型表中为“是”,如果不满足,则为“否”。为了说明这一点:

模型表有:

Indication Genes
Acute Myeloid Leukemia TP53
Acute Myeloid Leukemia GNAQ

cpg 数据框有:

Cancer Type Gene
Acute Myeloid Leukemia TP53
Acute Myeloid Leukemia ATM

我想制作一个如下所示的模型表(基于 cpg 数据):

Indication Genes Hotspot?
Acute Myeloid Leukemia TP53 Yes
Acute Myeloid Leukemia GNAQ No

到目前为止,我已经尝试(但失败了)创建一个带有条件的 for 循环来创建一个向量,希望随后将此向量附加为一个新列:

hotspot <- c()
for (i in 1:nrow(mockup)){
  if ((mockup$Genes[i] == cpg$Gene && mockup$Indication[i] == cpg$`Cancer Type`)){
    hotspot[i] <- print("yes")
    } else {
      hotspot[i] <- print("no")
    }
}

unique(hotspot)

一如既往,任何帮助都将不胜感激!

【问题讨论】:

    标签: r dataframe for-loop if-statement conditional-statements


    【解决方案1】:

    这是必需的吗? R 中的 for 循环,因为 R 已经矢量化,通常是可以避免的。

    • 基础 R 版本
    mockup <- read.table(text = 'Indication Genes
    "Acute Myeloid Leukemia"    TP53
    "Acute Myeloid Leukemia"    GNAQ', header = T)
    
    cpg <- read.table(text = "Cancer_Type   Gene
    'Acute Myeloid Leukemia'    TP53
    'Acute Myeloid Leukemia'    ATM", header = T)
    
    mockup$hotspot <- apply(mockup, 1, function(x) c('No','Yes')[(all(x %in% as.matrix(cpg)))
    
    mockup
                  Indication Genes hotspot
    1 Acute Myeloid Leukemia  TP53     Yes
    2 Acute Myeloid Leukemia  GNAQ      No
    

    dplyr管道友好版

    library(dplyr)
    
    mockup %>% rowwise() %>%
      mutate(hotspot = c('No', 'Yes')[+(all(cur_data() %in% as.matrix(cpg))+1)])
    #> # A tibble: 2 x 3
    #> # Rowwise: 
    #>   Indication             Genes hotspot
    #>   <chr>                  <chr> <chr>  
    #> 1 Acute Myeloid Leukemia TP53  Yes    
    #> 2 Acute Myeloid Leukemia GNAQ  No
    

    【讨论】:

    • c("Yes", "No")[rowSums(mockup != cpg) + 1]# [1] "Yes" "No" 不会更有效率
    • 感谢@akrun 注意到这一点。其实我只是从你那里学到的。但是,如果两个数据集中的行不相等,您建议的答案是否有效?
    猜你喜欢
    • 2018-11-13
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2023-03-22
    • 2016-04-10
    • 2015-10-22
    相关资源
    最近更新 更多