使用基于条件 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))]
我知道这个问题已经被问过几次了,但我似乎无法解决这个问题...
我有一个如下所示的数据框:
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))]