首页 > 解决方案 > 比较一个或两个数据帧 r 中的多列

问题描述

我有一个数据框:

name<-c('a','b','c','d','e')
type<-c('x','x','y','x','y')
chr<- c('ch1','ch1','ch1','ch2','ch2')
pos<- c(5000, 5100, 4999,5500,5100)
df<-data.frame(name,type, chr,pos)

df
我想遍历每一行,如果类型不相等,并且 chr 相等,并且 pos 在 abs(100) 内,然后使用匹配项创建一个新的 df (使用匹配名称的新列)。对于上述 df 行 1 和 3 将匹配,结果将是

在此处输入图像描述

理想情况下,我不想要互惠匹配,所以我想要

在此处输入图像描述

如果更容易,我可以根据类型分成两个 dfs。

我尝试了合并和过滤器(dplyr)的变体,但无处可去。

标签: r

解决方案


我们可以根据type列拆分数据,做一full_join by 'chr'列和filter列间绝对值pos小于100的行。

library(dplyr)

df %>%
  group_split(type) %>%
  purrr::reduce(full_join, by = 'chr') %>%
  filter(abs(pos.x - pos.y) < 100)

# A tibble: 1 x 7
#  name.x type.x chr   pos.x name.y type.y pos.y
#  <fct>  <fct>  <fct> <dbl> <fct>  <fct>  <dbl>
#1  a      x      ch1    5000 c      y       4999

然后,您可以删除任何不需要的列并根据您的要求重命名它们。


推荐阅读