【问题标题】:Extract rows with a loop based on a condition R基于条件 R 使用循环提取行
【发布时间】:2021-06-22 08:40:11
【问题描述】:

我知道这个问题已被问过几次,但我似乎无法完成这项工作......

我有一个如下所示的数据框:

                            Slycopersicum_O_F30 Slycopersicum_O_F31
BGI_novel_G000585            4.085328            3.886572
BGI_novel_G000600            4.085328            3.886572
BGI_novel_G001004            4.085328            3.886572
BGI_novel_G001146            4.085328            3.886572
BGI_novel_G001147            4.085328            3.886572
BGI_novel_G001673            4.085328            3.886572 

共有 24 列。现在我想提取符合我的标准的行,即

1:21 列的中值应大于 22:24 列的中值。为此,我编写了以下循环:

    for (i in 1:nrow(OpenTable)){
  if (median(as.numeric(OpenTable[i,1:21])) >
      median(as.numeric(OpenTable[i,22:24]))) {
    print(i) -> list 
    OpenTable[i,1:24] = SLU
}}

所以打印功能可以正常工作并打印所有符合条件的行。然而最后一行代码只提取了 1 行(我猜他们在每个循环中都被改变了) 谁能帮我弄清楚如何用符合条件的行填充数据框? 我希望我已经正确地陈述了这个问题,如果您需要更多信息,请告诉我。 干杯!

【问题讨论】:

    标签: r loops conditional-statements bioinformatics


    【解决方案1】:

    如果你创建一个空列表:

    my_list<-vector(mode = "list", length = (nrow(OpenTable))
    

    比使用 for 循环,而是将每个选定的行分配给您的空列表:

    for (i in 1:nrow(OpenTable)){
        if (median(as.numeric(OpenTable[i,1:21])) >
        median(as.numeric(OpenTable[i,22:24]))) {
        my_list[[i]]<-i
    }
    }
    

    您的列表将包含 NA,您应该在之后将其删除:

    my_list<-my_list[which(!sapply(my_list, is.null))]
    

    【讨论】:

      【解决方案2】:

      我不会用循环来做这件事。就矢量化函数而言,应该更容易考虑这一点。以下是我的做法(如果您共享整个数据框,我将编辑帖子):

      library(dplyr)
      
      data %>%
        rowwise() %>%
        filter(
         median(c_across(1:21)) > median(c_across(2:24))
        ) %>%
        ungroup()
      

      【讨论】:

        猜你喜欢
        • 2014-05-21
        • 1970-01-01
        • 2020-04-05
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 2014-09-12
        相关资源
        最近更新 更多