首页 > 解决方案 > 在具有相似名称的列之间使用 for 循环

问题描述

我正在尝试使用tidyverse( purrr) 包for loop在我的数据集上运行一个。我想检查数据集中某些列的某些条件是否为真。请注意,我正在尝试更加熟悉 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))
  }

标签: rloopstidyversepurrr

解决方案


如果您可以提供一个可重现的示例,会更容易提供帮助,但是根据我的理解,我创建了一个您的数据可能看起来的示例。

我们可以使用map2_intfrompurrr因为我们试图计算每对列中的行数

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

但是,base 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

推荐阅读