【问题标题】:Fast setdiff for each combinations of rows of two data.frames in RR中两个data.frame的行的每个组合的快速setdiff
【发布时间】:2021-12-28 12:14:18
【问题描述】:

我正在处理一些实验数据,我需要将参考数据和处理数据一起比较。我有两个 data.frames,目标是创建两个 data.frames 行的所有组合,并检查两行的 setdiff 是否大于 10,并将行 ID 保存到有匹配项的列表中。

我准备了一个通用的解决方案,如下所示:

set.seed(42)  ## for sake of reproducibility
df1 <- data.frame(a = rpois(150, 2), b = rpois(150, 2))
df2 <- data.frame(a = rpois(150, 10), b = rpois(150, 14))
out <- vector("list", nrow(df1))
names(out) <- rownames(df1)
for (i in seq_len(nrow(df1))) {
  map <- NULL
  for (j in seq_len(nrow(df2))) {
    if (all(setdiff(c(df2[j, ]), c(df1[i, ])) > 10)) {
      map <- c(map, j)
    }
  }
  out[[i]] <- map
}

问题在于,对于非常大的数据帧(超过 30 000 行),这是一个非常缓慢的解决方案。我不确定如何加快这个 for 循环。如有任何建议,我将不胜感激。

【问题讨论】:

    标签: r loops for-loop set-difference


    【解决方案1】:

    在下一个方法中,您将获得两个索引 i (rowname...1)(df1 的行号)和 j (rowname...4)(df2 的行号)

    library(tibble)
    library(tidyr)
    library(dplyr)
    df <- expand_grid(df1 %>% rownames_to_column(),df2 %>% rownames_to_column(), .name_repair = "universal")
    df$a <- df[[5]] - df[[2]]
    df$b <- df[[6]] - df[[3]]
    df[which(df$a > 10 & df$b > 10),c(1,4)]
    
    # A tibble: 2,194 × 2
       rowname...1 rowname...4
       <chr>       <chr>      
     1 1           47         
     2 1           97         
     3 2           47         
     4 2           97         
     5 2           111        
     6 2           117        
     7 3           8          
     8 3           11         
     9 3           13         
    10 3           14         
    # … with 2,184 more rows
    

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 2013-06-22
      • 2015-07-12
      • 1970-01-01
      相关资源
      最近更新 更多