【问题标题】:Merge two tables on two columns without order of variables playing a role合并两列上的两个表,而不影响变量的顺序
【发布时间】:2016-11-09 11:07:47
【问题描述】:

我有两个不同行号的表。我想根据两列的内容合并表格。但是,问题是我不希望在合并时变量的顺序很重要。示例:

表1:

Gene1 Gene2   p-value
TP53  ARID1A  0.001
ATM   ATR     0.0005

表2:

Gene1  Gene2  p-value
ARID1A  TP53  0.0007
ATM     ATR   0.004

我试过了:

merge(Table1, Table2, by = c("Gene1", "Gene2"), all.x = TRUE)

但问题是它只会合并 'ATM' 和 'ATR' 而不会合并 'TP53' 和 'ARID1A' 因为它们的顺序不同。

有没有办法合并两个表而不考虑列顺序?

【问题讨论】:

  • 你可以试试merge(t1,t2,by=c("Gene1","Gene2"),all=TRUE)
  • 这会部分起作用。现在我得到一张两张桌子的大桌子。但是,“TP53”“ARID1A”和“ARID1A”“TP53”显示为单独的行。我想知道是否有办法让它们出现在同一行。
  • 请分享您的预期输出,以便我们更轻松地找出解决方案。
  • 对基因名称进行排序然后合并,这样我们就可以确定“TP53,ARID1A”对在Gene1列上总是有“ARID1A”。
  • @Chirayu Chamoli 我希望输出为:TP53 ARID1A 0.001 0.0007 用于第一行,当然ATM ATR 0.0005 0.004 用于第二行。所以基本上,当 Gene1 和 Gene2 的组合在两个表之间共享时,这些行将被合并,但按该顺序不是必需的。谢谢!

标签: r merge


【解决方案1】:

使用sqldf

library(sqldf)

sqldf("
SELECT df1.*, 
       df2.`p.value` 
FROM   df1, df2 
WHERE (df1.Gene1 = df2.Gene1 AND
       df1.Gene2 = df2.Gene2) OR
      (df1.Gene1 = df2.Gene2 AND
       df1.Gene2 = df2.Gene1)")

#   Gene1  Gene2 p.value p.value
# 1  TP53 ARID1A   1e-03   7e-04
# 2   ATM    ATR   5e-04   4e-03

【讨论】:

  • 部分“or”必须是“and”。
  • 是的,中间的应该是and。
  • 我们可能还需要一些“()”。
  • tks。我回家要迟到了,这将是马虎的原因。
  • 有没有办法在标准熊猫中做到这一点?
【解决方案2】:

我们可以对基因名称进行排序然后合并:

#sort gene names
df1$GeneMin <- pmin(df1$Gene1, df1$Gene2)
df1$GeneMax <- pmax(df1$Gene1, df1$Gene2)

df2$GeneMin <- pmin(df2$Gene1, df2$Gene2)
df2$GeneMax <- pmax(df2$Gene1, df2$Gene2)

# then merge
merge(df1, df2, by = c("GeneMin", "GeneMax"))
#   GeneMin GeneMax Gene1.x Gene2.x p.value.x Gene1.y Gene2.y p.value.y
# 1  ARID1A    TP53    TP53  ARID1A     1e-03  ARID1A    TP53     7e-04
# 2     ATM     ATR     ATM     ATR     5e-04     ATM     ATR     4e-03

# tidy up columns, column names
#....

或者我们可以合并两次然后 rbind:

# double merge, this might cause unexpected results
rbind(
  merge(df1, df2, by = c("Gene1", "Gene2")),
  merge(df1, df2, by.x = c("Gene1", "Gene2"), by.y = c("Gene2", "Gene1"))
  )
#   Gene1  Gene2 p.value.x p.value.y
# 1   ATM    ATR     5e-04     4e-03
# 2  TP53 ARID1A     1e-03     7e-04

数据

# data
df1 <- read.table(text = "
Gene1 Gene2   p-value
TP53  ARID1A  0.001
ATM   ATR     0.0005", header = TRUE, as.is = TRUE)

df2 <- read.table(text = "
Gene1  Gene2  p-value
ARID1A  TP53  0.0007
ATM     ATR   0.004", header = TRUE, as.is = TRUE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多