我有
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
匹配,B
与 E
匹配,C
与 D
我想为像这样的对创建一个 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 行)的键 1
和 F
匹配已与 A
(第 6 行)以及键 1
匹配。 Common key不一定是数字,也可以是string或factor。
我怎样才能做到这一点 1) 如果我的数据框包含仅 匹配对,2) 如果我的 DF 也包含观察没有 匹配对 3) 是否有 tidyverse解决方案?
最佳答案
我们可以使用pmin
和pmax
获得唯一的字母组合(相同顺序)。然后,我们可以使用 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 - 如何根据属性值从单个对象数组创建多个对象数组