使用基于条件 R 的循环提取行

Extract rows with a loop based on a condition R

我知道这个问题已经被问过几次了,但我似乎无法解决这个问题...

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

                            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 行(我猜它们在每个循环中都会被更改) 谁能帮我弄清楚如何用符合条件的行填充数据框? 我希望我已经正确地陈述了这个问题,如果您需要更多信息,请告诉我。 干杯!

我不会用循环来做这个。从向量化函数的角度考虑这个问题应该更容易。以下是我的操作方法(如果您共享整个数据框,我将编辑 post):

library(dplyr)

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

也许如果您创建一个空列表:

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))]