【问题标题】:How to merge two data frames and fill with different options based on coincidences如何合并两个数据框并根据巧合填充不同的选项
【发布时间】:2021-03-09 04:15:19
【问题描述】:

我有两个数据框 yz

y <- data.frame(ID = c("A", "A", "A", "B", "B"), gene = c("a", "b", "c", "a", "c"))
z <- data.frame(A = c(2,6,3), B = c(8,4,9), C=c(1,6,2))
rownames(z) <- c("a", "b", "c")

因此,对于 y,我有一个表格,其中包含每个患者的患者 ID 和基因,在 Z 中,我在第一行有相同的患者 ID,并且有一个具有特定值的基因列表(这在此处并不重要)。 y 中的基因在 z 中,但在 z 中有些基因不包含在 y 中。 我想做的是merge这个框架并有这样的东西:

       a   b   c
A      1   1   1 
B      1   0   1 

所以对于每个患者,如果z中的基因也在y,中,则填1,否则填0

我真的不知道如何处理这个,有什么想法吗? 谢谢

【问题讨论】:

  • z 中的ABC 列是否与结果有任何关系?
  • 提出问题时,编写可重现的示例(我们可以在自己的 R 会话中轻松剪切和粘贴的示例)。您希望我们能够轻松访问您的 yz 对象。看看dput这个函数,可能会有帮助。
  • 话虽如此,您需要投射或传播您的数据,合并它,然后再次投射或传播它。为此,如果您是 tidyverse 的粉丝,请尝试 tidyr::pivot_widertidyr::pivot_longer。如果你更老派,reshape2::dcastreshape2::melt
  • 感谢您对再现性的评论和建议,您当然完全正确,下次我一定会考虑。感谢您的时间和精力!

标签: r merge


【解决方案1】:

我已根据您的问题提出了 RE(下次将此添加到您的问题中):

y <- data.frame(ID = c("id_A", "id_A", "id_A", "id_B", "id_B"), gene = c("a", "b", "c", "a", "c"))
z <- data.frame(id_A = c(2,6,3), id_B = c(8,4,9), id_C=c(1,6,2))
rownames(z) <- c("a", "b", "c")

这里的想法是pivot_longer您的桌子,这样您就可以轻松加入。

为此,您首先需要将您的行名变成一个字段:

z <- tibble::rownames_to_column(z, "gene")

然后,您的 z 表旋转时间更长:

library(tidyr)
z_long <- pivot_longer(z, starts_with("id_"), names_to = "ID")

并加入您的y 表:

library(dplyr)
table_join <- left_join(y, z_long)

最后,你只需要计算频率:

table(table_join$ID, table_join$gene)
   
       a b c
  id_A 1 1 1
  id_B 1 0 1

【讨论】:

  • “主要问题”是我无法创建 z_long,因为原始 z 有近 56.000 行(基因名称)
  • 我认为这不是问题。如果您的计算机上有足够的内存 (RAM),那么基因的数量应该不是问题。至于编写脚本行,我使用starts_with 更新了我的问题,以便更轻松地选择 ID。尝试一下,如果它不起作用,请更新可重现的示例,以便更好地代表您的问题。
  • 是的,问题出在 RAM 内存上,但我想通了,您的代码运行良好。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2022-01-01
  • 2022-01-20
  • 2020-10-20
相关资源
最近更新 更多