r - 左连接满足条件的 LHS 行上的两个表,将其他表保留为 NA
问题描述
考虑以下场景:
test <- data.frame(Id1 = c(1, 2, 3, 4, 5, 10, 11),
Id2 = c(3, 4, 10, 11, 12, 15, 9),
Type = c(1, 1, 1, 2, 2, 2, 1) )
test
#> Id1 Id2 Type
#> 1 1 3 1
#> 2 2 4 1
#> 3 3 10 1
#> 4 4 11 2
#> 5 5 12 2
#> 6 10 15 2
#> 7 11 9 1
我想仅在具有特定值时才加入test
自身,例如以这样的方式获得以下结果:Id2 = Id1
Type
Type == 1
#> Id1 Id2 Type.x Id2.y Type.y
#> 1 1 3 1 10 1 # matches row 3
#> 2 2 4 1 11 2 # matches row 4
#> 3 3 10 1 15 2 # matches row 6
#> 4 4 11 2 NA NA # matches row 7 but Type != 1
#> 5 5 12 2 NA NA # Type !=1
#> 6 10 15 2 NA NA # Type !=1
#> 7 11 9 1 NA NA # Type == 1 but no matches
由于在这种情况下,test
表示层次结构,因此这种类型的连接将允许我“扩展”层次结构,以便每一行最终以Id2
不等于任何值的Id1
.
怎样才能实现这样的加入?
解决方案
Tidyverse 是一个很棒的数据操作包。在这里,我们可以这样做:
library(tidyverse)
joined <- test %>% left_join(test %>% filter(Type==1), by = c("Id1" = "Id2"))
joined
更新:
library(tidyverse)
joined <- test %>%
filter(Type==1) %>% left_join(test, by = c("Id2" = "Id1")) %>%
bind_rows(test %>% filter(Type==2) %>% rename(Type.x = Type))
joined
Id1 Id2 Type.x Id2.y Type.y
1 3 1 10 1
2 4 1 11 2
3 10 1 15 2
11 9 1 NA NA
4 11 2 NA NA
5 12 2 NA NA
10 15 2 NA NA
推荐阅读
- python - windows上使用sublime text 3编辑Anaconda python代码
- amazon-web-services - 如果用于 S3 加密的 AWS 密钥丢失会怎样?
- reactjs - onmouseover 我需要更改 'react-google-maps' 的 'Polygon' 组件中的 'options' 并且需要为 Polygon 提供一个可区分的 'id'
- jquery - Ajax 工作但被重定向到处理页面 php
- reactjs - 我可以更新减速器钩子内的外部状态吗?
- clickhouse - 如何旋转子组?
- c# - IIS - 线程池设置 machine.config 与 web.config
- winforms - 使用 ListView 所有者绘制的 DrawItem 大小与 LargeIcon ImageSize 不同
- python - 如何扩展绘图中的回归线?
- node.js - 如何使用 Nodejs 将 JSON 文件中的“null”值视为 null