查找分组变量的并集和交集
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 及更高版本用于管道 |>
):
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 的新功能。如果您在此之前使用过某些东西,则可以选择将|>
替换为%>%
,因为您已经在使用dplyr
。如果您没有使用dplyr
,那么可能需要library(magrittr)
才能访问%>%
。
我已对其进行了修改,但它再次引发错误。您能否在 R 中发布先前版本的等效答案?我正在使用 dplyr 顺便说一句以上是关于查找分组变量的并集和交集的主要内容,如果未能解决你的问题,请参考以下文章