相交数据框列,其中值与R

时间:2016-10-26 16:11:09

标签: r

我有两个不同的数据框架比较来自两个不同实验的基因表达(让我们称之为df1和df2)。在两个数据框中,第一列是一个因子变量,列出了感兴趣的基因(df1 $ gene,df2 $ gene)。我想找到这些列相交的位置。通常我会使用类似

的东西创建一个角色向量

common<-Reduce(intersect, list(df1$gene,df2$gene))

我的问题是关于在这种情况下如何鉴定基因的格式不同(因为它们来自不同的人)。例如,df1 $基因单独使用常规缩写(因为它应该用于简单的数据分析),而df2 $基因包括在括号中包含缩写的描述。描述有时也包含独立于缩写的括号,有时只使用缩写而没有任何描述或括号。下面我已经包含了每个数据集中三行的模拟打印。请注意,对于每个df,这些是相同的三个基因(以不同的顺序)。

head (df1$genes, n=3)
[1] TFPI2    SLC26A9    IL6  

head (df2$genes, n=3)
[1] solute carrier family 26, member 9 (SLC26A9)     interleukin 6 (interferon, beta 2) (IL6),     TFPI2

我想要的只是这些列表相交的输出,格式为df1标签(即只是缩写)。我很擅长使用R,并且无法弄清楚如何做到这一点。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

根据您的完整数据集的混乱程度,您可以将大量这些与agrep匹配,例如:

genes1 <- c("TFPI2", "SLC26A9", "IL6", "TP53")
genes2 <- c("solute carrier family 26, member 9 (SLC26A9)",
  "interleukin 6 (interferon, beta 2) (IL6)",
  "TFPI2")

# fuzzy string matching
matches <- sapply(genes1, agrep, genes2)

# find 0 length matches (misses), 
# could also handle >1 matches here
matches[sapply(matches, length) == 0] <- NA

data.frame(
  symbol = genes1,
  match = genes2[unlist(matches)]
)
#    symbol                                        match
# 1   TFPI2                                        TFPI2
# 2 SLC26A9 solute carrier family 26, member 9 (SLC26A9)
# 3     IL6     interleukin 6 (interferon, beta 2) (IL6)
# 4    TP53                                         <NA>