【发布时间】:2022-01-11 14:46:09
【问题描述】:
我正在处理两个数据集 - 一组有成对的项目:
original <- data.frame(label1 = c("cat", "cat", "dog", "dog", "cat", "tiger", "tiger", "cow"),
label2 = c("dog", "dog", "cat", "cat", "dog", "cow", "cow", "tiger"))
original
label1 label2
1 cat dog
2 cat dog
3 dog cat
4 dog cat
5 cat dog
6 tiger cow
7 tiger cow
8 cow tiger
第二个数据集包含第一组项目的索引代码:
index <- data.frame(item = c("cat", "dog", "tiger", "cow"),
code = c(1, 0, 1, 0))
index
item code
1 cat 1
2 dog 0
3 tiger 1
4 cow 0
我正在寻找一种方法来创建两个新列:tag0 和 tag1,使其看起来像这样:
new <- data.frame(label1 = c("cat", "cat", "dog", "dog", "cat", "tiger", "tiger", "cow"),
label2 = c("dog", "dog", "cat", "cat", "dog", "cow", "cow", "tiger"),
tag1 = c("cat", "cat", "cat", "cat", "cat", "tiger", "tiger", "tiger"),
tag0 = c("dog", "dog", "dog", "dog", "dog", "cow", "cow", "cow"))
new
label1 label2 tag1 tag0
1 cat dog cat dog
2 cat dog cat dog
3 dog cat cat dog
4 dog cat cat dog
5 cat dog cat dog
6 tiger cow tiger cow
7 tiger cow tiger cow
8 cow tiger tiger cow
tag0指的是code=0对应的标签,tag1指的是index数据帧中code=1对应的标签。
谁能帮助我提供基于tidyverse 的解决方案?
【问题讨论】:
-
这个
index架构有点奇怪。 {label1,label2} 到 (tag1,tag0) 的逻辑映射是什么?我的猜测是,无论顺序如何,{cat,dog} 与 {dog,cat} 的处理方式相同,其中cat和dog总是配对在一起;tiger和cow也是如此。但这在问题中并没有说清楚...... -
index包含来自original的所有唯一标签的列表,这些标签存储为item,具有code值。虽然项目(狗或猫)可能以相同的概率出现在一行内的label1或label2,但tag指的是它们的code值。 -
感谢您接受我的回答!我刚刚用一个额外的解决方案更新了我的答案,它具有更优雅的工作流程并且更灵活。
-
基本上,
c_across(label1 | label2)从行1获取c("cat", "dog"),从行c("cow", "tiger")获取c("cow", "tiger"),等等;与rowwise()一起使用时。这让我们检查item是否与该行中的一个标签匹配。具体来说,它允许我们对匹配正则表达式label\d+的所有label*列执行此操作。 -
然而如果你尝试
c(label1 | label2),你会得到一个长向量,基本上是label1列堆叠在label2列上:c(c("cat", "cat", "dog", ..., "tiger", "cow"), c("dog", "dog", "cat", ..., "cow", "tiger"))。当然,这对于每行内的比较是无用的。
标签: r string-matching