【问题标题】:Subset a dataframe in R based on another dataframe, taking multiple hits [duplicate]基于另一个数据帧在 R 中对数据帧进行子集化,多次点击
【发布时间】:2021-10-16 09:56:18
【问题描述】:

我有两个数据框

df1

names   target   start  end

Gene_1  chr5     1      345
Gene_2  chr1     1      678
Gene_3  chr4     1      909
Gene_4  chr48    1      876
Gene_5  chr8     1      432
Gene_6  chr9     1      556
Gene_7  chr12    1      345

df2

gene_names   positions

Gene_1       221
Gene_2       34
Gene_2       444
Gene_2       324
Gene_3       99
Gene_3       232
Gene_4       221
Gene_4       334
Gene_4       390
Gene_6       200
Gene_7       146

df1df2 短得多。 df2 的第一列在第二列中有不同值的重复观察。它的第一列与df1 中同源列中的观察结果缺乏一些匹配(很多)。

我想将它们合并成一个df_new,其中包含gene_namesdf2的另一列以及df1另一列的相关信息,甚至在@987654331中的观察时重复@ 出现 2 次以上。

我为合并铺平了道路

df_new<-merge(df2, df1, by.x = "gene_names", by.y = "names")

我有一个初步的结果,我不太确定。 有人可以阐明更多吗?

预期输出

df_new

gene_names   positions  target   start  end

Gene_1       221        chr5     1      345
Gene_2       34         chr1     1      678
Gene_2       444        chr1     1      678
Gene_2       324        chr1     1      678
Gene_3       99         chr4     1      909
Gene_3       232        chr4     1      909
Gene_4       221        chr48    1      876
Gene_4       334        chr48    1      876
Gene_4       390        chr48    1      876
Gene_6       200        chr9     1      556
Gene_7       146        chr12    1      345

【问题讨论】:

  • 基于共享的数据df_new&lt;-merge(df2, df1, by.x = "gene_names", by.y = "names") 给出了预期的输出。您的原始数据有什么问题?
  • 我预计它会包含稍多一些的观察结果。也许我应该交叉检查我正在合并的数据的质量......
  • ``` df_new

标签: r dataframe merge subset


【解决方案1】:

我们可以将right_joindf1df2 一起使用:

library(dplyr)
df_result <- df2 %>% 
  right_join(df1, by= c("gene_names"="names"))

输出:

   gene_names positions target start   end
   <chr>          <dbl> <chr>  <dbl> <dbl>
 1 Gene_1           221 chr5       1   345
 2 Gene_2            34 chr1       1   678
 3 Gene_2           444 chr1       1   678
 4 Gene_2           324 chr1       1   678
 5 Gene_3            99 chr4       1   909
 6 Gene_3           232 chr4       1   909
 7 Gene_4           221 chr48      1   876
 8 Gene_4           334 chr48      1   876
 9 Gene_4           390 chr48      1   876
10 Gene_6           200 chr9       1   556
11 Gene_7           146 chr12      1   345
12 Gene_5            NA chr8       1   432

数据:

df1 <- structure(list(names = c("Gene_1", "Gene_2", "Gene_3", "Gene_4", 
"Gene_5", "Gene_6", "Gene_7"), target = c("chr5", "chr1", "chr4", 
"chr48", "chr8", "chr9", "chr12"), start = c(1, 1, 1, 1, 1, 1, 
1), end = c(345, 678, 909, 876, 432, 556, 345)), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -7L))

df2 <- structure(list(gene_names = c("Gene_1", "Gene_2", "Gene_2", "Gene_2", 
"Gene_3", "Gene_3", "Gene_4", "Gene_4", "Gene_4", "Gene_6", "Gene_7"
), positions = c(221, 34, 444, 324, 99, 232, 221, 334, 390, 200, 
146)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -11L))

【讨论】:

    【解决方案2】:

    我们可以从base R使用merge

    merge(df1, df2, all.y = TRUE, by.x = "gene_names", by.y = "names")
    

    【讨论】:

      猜你喜欢
      • 2020-07-07
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多