来自df的多列的grep向量和R

时间:2018-08-09 21:52:41

标签: r

我需要匹配从df3 $ end到df2 $ V2和df $ V3的模式向量。然后,最终输出文件应为df1,并从df2附加匹配的列V4和V5,如预期输出所示。

    df1 <- read.table(text='  chr    init
12  25289552
                  3 180418785
                  3 180434779
                  6 69909
                  5 284892182', header=TRUE)


df2 <- read.table(text='    V1    V2  V3  V4  V5  V6
                  1     69094   321233  medium  2.1   321234
                  1     69094 21231310  medium  3.4 21231313
                  12 25289552 180434559  high  1.1 180434779
                  1     69095 69909 medium  2.9 69909
                  3 180418785 284892182 medium  1.8 284892182
                  3 180434779 69909 low 2.8 69909', header=TRUE)

df3 <- read.table(text='  chr    init end
 12  25289552 180434779
                  3 180418785 321233
                  3 180434779 180434779
                  6 69909     69909
                  5 284892182 21231313
                  3 180418785 284892182 ', header=TRUE)
#expected output

df1_chr    df1_init df3_end  df2_V4 df2_V5 df2_V4_2 df2_V5_2
12  25289552 180434779 high  1.1 NA NA NA
3 180418785 321233  medium  2.1 284892182 medium     1.8 
3 180434779 180434779  high  1.1 NA NA NA
6 69909 69909 medium/low  2.9/2.8 NA NA NA
5 284892182 21231313  medium  3.4 NA NA NA

我尝试过:

matches <- filter(df2, grepl(paste(df3$end, collapse="|"), df2$V3,df2$V4))

这给出了匹配的行。现在,我需要使用df1并将df3中的匹配结束列,V4和df2中的V5添加到输出中。如果df1_init具有不同的df3_ends,则必须将它们添加为单独的列,如示例所示。感谢您为最终输出所提供的帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用dplyr吗?

library(dplyr)

df1 %>% 
inner_join(df3, by=c("chr","init")) %>% 
inner_join(df2,by=c("end"="V3")) %>% 
select(-V1,-V2) %>% group_by(chr,init,end) %>% 
summarise(df2_V4 = paste(V4,collapse=","),df2_V5 = paste(V5,collapse=","))