我正在尝试使用tidyverse
(purrr
)包在我的数据集中运行for loop
。我想检查沿数据集的某些列是否满足某些条件。请注意,我正在尝试更加熟悉tidyverse及其功能,而不是依赖于BaseR。
这是我要为其编写for循环的代码。
nrow(subset(data, flwr_clstr1>1 & bud_clstr1==0))
nrow(subset(data, flwr_clstr2>1 & bud_clstr2==0))
nrow(subset(data, flwr_clstr3>1 & bud_clstr3==0))
我有相似的数据列(在本例中为flwr_clstr),但最后一位数字不同。另外,如果还有另一种使用tidyverse
来检查这些“条件”的方法,那也很好。
这是我尝试的for循环。
check1 <- vector("double", ncol(data_phen))
for (i in seq_along(data_phen)) {
check[[i]] <- nrow(subset(data, flwr_clstr[[i]]>1 & bud_clstr[[i]]==0))
}
答案 0 :(得分:0)
如果您可以提供一个可重现的示例,将会更容易获得帮助,但是,根据我的理解,我创建了一个示例,以了解您的数据的外观。
我们可以使用map2_int
中的purrr
,因为我们试图计算每对列中的行数
library(dplyr)
library(purrr)
map2_int(data %>% select(starts_with("flwr_clstr")),
data %>% select(starts_with("bud_clstr")),
~sum(.x > 1 & .y == 0)) %>% unname()
#[1] 2 3 1
但是,基数R也不错。可以使用mapply
col1 <- grep("^flwr_clstr", names(data))
col2 <- grep("^bud_clstr", names(data))
mapply(function(x, y) sum(x > 1 & y == 0), data[col1], data[col2])
数据
假设"flwr_clstr.."
和"bud_clstr.."
的列数相等
data <- data.frame(flwr_clstr1 = c(2, 1, 2, 1, 0), flwr_clstr2 = c(2, 2, 2, 1, 0),
flwr_clstr3 = c(1, 1, 2, 1, 1), bud_clstr1 = 0, bud_clstr2 = 0,bud_clstr3 = 0)
看起来像
data
# flwr_clstr1 flwr_clstr2 flwr_clstr3 bud_clstr1 bud_clstr2 bud_clstr3
#1 2 2 1 0 0 0
#2 1 2 1 0 0 0
#3 2 2 2 0 0 0
#4 1 1 1 0 0 0
#5 0 0 1 0 0 0