r - 合并 R 中的两个 df,其中值可以在两列中交换(即 col1 可能存在于另一个 df 中的 col2 中)
问题描述
我正在尝试将两个数据框合并为两列,其中gene1 或gene2 的值可能位于任一列中
df1<-data.frame(gene_1=c('A','B','E'),
gene_2=c('B','C','C'),
value =c(0,1,1))
df2<-data.frame(gene_1=c('B','B','D'),
gene_2=c('A','C','E'),
value=c(1,0.5,1))
期望的结果是:
result<-data.frame(gene_1=c('A','B','D','E'),
gene_2=c('B','C','E','C'),
value1=c(0, 1, NA, 1),
value2=c(1, 0.5, 1, NA))
它将合并两个dfs中的第一行gene1 = A,gene2 = B和gene1 = B和gene2 = A,因为gene1与gene2是任意的。
谢谢你
解决方案
您可以对两个数据集中的列进行排序gene_1
,gene_2
然后执行full_join
.
library(dplyr)
df1 %>%
transmute(col1 = pmin(gene_1, gene_2),
col2 = pmax(gene_1, gene_2),
value1 = value) %>%
full_join(df2 %>%
transmute(col1 = pmin(gene_1, gene_2),
col2 = pmax(gene_1, gene_2),
value2 = value),
by = c('col1', 'col2'))
# col1 col2 value1 value2
#1 A B 0 1.0
#2 B C 1 0.5
#3 C E 1 NA
#4 D E NA 1.0
推荐阅读
- firebase - 如何在firestore上的文档中读取和创建所有提要的列表,并创建一个替换以下代码中的标题列表的列表
- c# - Service.Credentials = new WebCredentials(用户名、密码、域名);
- java - 使用spring cloud gateway合并两个微服务的结果
- testing - 在 TestCafe 中的测试运行期间累积所有 JS 警告和错误
- c# - 在客户端中为 StreamSocket 或 SslStream 设置 SNI
- python - 如何使用广播周日历对数据框中的日期时间序列进行分类?
- mongodb - MongoDB 总和
- maven - docker-maven-plugin 没有创建 dockerfile
- matplotlib - 强制 X 轴只有整数刻度,MaxNLocator 和 MultipleLocator 不起作用
- asp.net-mvc - asp.net MVC“创建视图”和数据