r - 识别匹配对并创建一个公共(public) key

我有

df<-data.frame(record_id=c("A", "B", "C", "D", "E", "F"), var1=1:6, matched.with=rev(c("A", "B", "C", "D", "E", "F")))

> df
  record_id var1 matched.with
1         A    1            F
2         B    2            E
3         C    3            D
4         D    4            C
5         E    5            B
6         F    6            A

因此,id A 已与 F 匹配,BE 匹配,CD

我想为像这样的对创建一个 common.key 变量

df.common.key
  record_id var1 matched.with common.key
1         A    1            F          1
2         B    2            E          2
3         C    3            D          3
4         D    4            C          3
5         E    5            B          2
6         F    6            A          1

这表明 A 已与 F(第 1 行)的键 1F 匹配已与 A(第 6 行)以及键 1 匹配。 Common key不一定是数字,也可以是string或factor。

我怎样才能做到这一点 1) 如果我的数据框包含 匹配对,2) 如果我的 DF 也包含观察没有 匹配对 3) 是否有 tidyverse解决方案?

最佳答案

我们可以使用pminpmax 获得唯一的字母组合(相同顺序)。然后,我们可以使用 grp 列来创建 common.key

library(tidyverse)

df %>% 
  group_by(grp = paste0(pmin(record_id, matched.with), pmax(record_id, matched.with))) %>% 
  mutate(common.key = cur_group_id()) %>% 
  select(-grp)

输出

  grp   record_id  var1 matched.with common.key
  <chr> <chr>     <int> <chr>             <int>
1 AF    A             1 F                     1
2 BE    B             2 E                     2
3 CD    C             3 D                     3
4 CD    D             4 C                     3
5 BE    E             5 B                     2
6 AF    F             6 A                     1

https://stackoverflow.com/questions/71470368/

相关文章:

c++ - 为什么 deques 默认用作堆栈的底层容器,而 vectors 可以做到这一点?

javascript - 我将如何在 P5.js 的 Canvas 上的两个位置之间创建点?

rust - 如何在 CLI 应用程序中处理 "./"、 "~/"和相关参数

html - 如何使用 html + Tailwind CSS 使表格可滚动

reactjs - webpack-cli : Invalid options object. De

javascript - 如何根据属性值从单个对象数组创建多个对象数组

javascript - Prop 验证中缺少 react / Prop 类型

vue.js - Vitest 与 Quasar 的集成

typescript - 我可以根据参数更改返回类型吗

c++ - 没有非空函数的返回语句是否是未定义的行为,其中控制永远不会结束?