在名称相似的列之间使用for循环

时间:2019-07-16 03:45:49

标签: r loops tidyverse purrr

我正在尝试使用tidyversepurrr)包在我的数据集中运行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))
  }

1 个答案:

答案 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