查找分组变量的并集和交集

Posted

技术标签:

【中文标题】查找分组变量的并集和交集【英文标题】:Find the union and intersection of grouped variables 【发布时间】:2022-01-16 22:36:11 【问题描述】:

我有两个已装箱的向量。 基本上,我想要一个函数来找到这两个向量(输出)的并集和交集。 似乎没有支持此功能的功能。知道如何执行所需的输出向量吗?

example1 <- c("18--25", "26--30", "31--50", "51+")
example2 <- c("18--23", "24--30", "31--65", "66+")

output <- c("18--23", "24--25", "26--30", "31--50", "51--65", "66+")

【问题讨论】:

我相信为了提取所需的输出,必须通过删除“--”和“+”将 grous 转换为数字。如果有人可以构建一个功能,您是否还可以包含区分组的符号(“--”和“+”) 一个助手可能是:strcapture("([0-9]+)[^0-9]+([0-9]*)", example1, list(a=1L, b=1L)),生成一个包含范围的两列框架,NA 用于无限结束。 【参考方案1】:

我们可以像这样删除重复项并每 2 个元素组合一个排序向量(R 版本 4.0 及更高版本用于管道 |&gt;):

f <- function(x, y, sep, max)
  m <- paste0("\\", max)
  gsub(m, "", c(x, y)) |>
    strsplit(sep, fixed = T) |>
    unlist(use.names = F) |>
    sort() |>
    unique() |>
    as.numeric() |>
    (\(.) tapply(., gl(length(.), 2, length(.)), paste, collapse = sep, simplify = T))() |>
    (\(.) .[!is.na(.)])() |>
    as.character() |>
    (\(.) .[length(.)] <- paste0(.[length(.)], max) ; .)()
  

# for older R versions
f <- function(x, y, sep, max)
  x <- gsub(paste0("\\", max), "", c(x, y))
  x <- as.numeric(unique(sort(unlist(strsplit(x, sep, T), use.names = F))))
  x <- tapply(x, gl(length(x), 2L, length(x)), paste, collapse = sep, simplify = T)
  x <- as.character(x[!is.na(x)])
  x[length(x)] <- paste0(x[length(x)], max)
  x


f(example1, example2, "--", "+")
[1] "18--23" "24--25" "26--30" "31--50" "51--65" "66+" 

【讨论】:

好像有意外符号 @Nicolas123 不确定这意味着什么 - 当您运行该函数时,它会返回不正确的结果?还是抛出错误? 由于意外符号而引发错误。 |> 运算符是做什么的? Nicolas123,这是 R-4.1 的新功能。如果您在此之前使用过某些东西,则可以选择将|&gt; 替换为%&gt;%,因为您已经在使用dplyr。如果您没有使用dplyr,那么可能需要library(magrittr) 才能访问%&gt;% 我已对其进行了修改,但它再次引发错误。您能否在 R 中发布先前版本的等效答案?我正在使用 dplyr 顺便说一句

以上是关于查找分组变量的并集和交集的主要内容,如果未能解决你的问题,请参考以下文章

用java编写程序,求集合的并集、交集和差集

在 O(mlogn) 时间内计算两个未排序数组的并集和交集

Arules 中规则的并集和交集在算术上是有意义的

《算法零基础100讲》(第53讲) 区间问题 区间的并集和交集

列表交集,并集和差集

java对两个字符串数组取交集并集和差集