【问题标题】:Using a for loop across columns with similar names在具有相似名称的列之间使用 for 循环
【发布时间】:2019-07-16 03:45:49
【问题描述】:

我正在尝试使用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))
  }

【问题讨论】:

    标签: r loops tidyverse purrr


    【解决方案1】:

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

    我们可以使用purrr 中的map2_int,因为我们正在尝试计算每对列中的行数

    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
    

    【讨论】:

    • 是的,应该提供一个示例数据集。将来会做!此外,两个参数都有相同的列。代码有效.. 谢谢!
    猜你喜欢
    • 2019-09-19
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多