在R中联接两个数据框

时间:2020-07-12 19:08:33

标签: r dataframe merge

很抱歉,如果这是一个非常基本的问题,但是在我的R项目上工作时遇到了一个问题。基本上我有两个数据框对象,一个是基因及其在各种患者中的表达水平的主列表,另一个是只有一列的大小。然后,只有一列的是属于特定子基因类别的基因列表,所有这些子类别均在主列表中。我正在尝试创建一个数据框,其中包含特定的基因子集以及它们在不同患者中的表达,这些信息包含在主列表中。我尝试使用merge()函数,但是只创建了一个空的数据框。

基本上,代码类似于:new_dataframe <-merge(master_list,specific_gene_list,by =“ gene”)。我以为这段代码应该查看我的主列表,找到特定列表中的所有基因,然后只获取那些基因并添加用于患者表达的列,但是我的数据框为空,它创建了一个包含主列表中所有列的数据框列表,但未填写任何值。非常感谢您的帮助。

一个视觉示例:

主数据框

x:1

y:3

z:4

w:6

特定数据框:

x

y

所需的数据帧:

x:1

y:3

3 个答案:

答案 0 :(得分:2)

我们可以使用regex_inner_join中的fuzzyjoin

library(fuzzyjoin)
df3 <-  regex_inner_join(df1, df2, by = 'gene') %>% 
      transmute(gene = gene.x)
df3
#   gene
#1 x: 1
#2 y: 3

数据

df1 <- structure(list(gene = c("x: 1", "y: 3", "z: 4", "w: 6")),
   class = "data.frame", row.names = c(NA, 
-4L))

df2 <- structure(list(gene = c("x", "y")), class = "data.frame", row.names = c(NA, 
-2L))

答案 1 :(得分:0)

您还可以按冒号分隔列,并添加新列以合并数据框。

mergecol <- c("x: 1",
"y: 3",
"z: 4",
"w: 6")

df <- cbind(mergecol, as.data.frame(do.call(rbind, strsplit(mergecol, ':'))))
df2 <- data.frame(V1 = c('x', 'y'))

mergedf <- merge(df, df2, by="V1")


result <- c('x: 1', 'y: 3')

assertthat::are_equal(result, mergedf$mergecol)
#[1] TRUE

答案 2 :(得分:0)

您可以使用master_list分隔separate中的列,与specific_gene_list合并,然后再次将列与unite合并。

library(dplyr)
library(tidyr)

master_list %>%
  separate(gene, c('gene', 'value'), sep = ':\\s*') %>%
  inner_join(specific_gene_list, by = 'gene') %>%
  unite(gene, gene, value, sep = " : ")

#   gene
#1 x : 1
#2 y : 3