我正在尝试使用tidyverse
( purrr
) 包for loop
在我的数据集上运行 a 。我想检查沿数据集的某些列是否存在一定数量的条件。请注意,我试图更加熟悉 tidyverse 及其功能,而不是依赖 Base R。
这是我想为其编写 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))
}
如果您可以提供一个可重现的示例,那么帮助会更容易,但是我根据我的理解创建了一个示例,说明您的数据可能是什么样子。
我们可以使用map2_int
frompurrr
因为我们试图计算每对列中的行数
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句