【问题标题】: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 用于无限结束。

标签: r dplyr data.table


【解决方案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 顺便说一句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多