首页 > 解决方案 > 使用基于行和列的另一个表中的值填充表

问题描述

我有一个看起来像这样的空数据框:

df <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
                          "NRAS"),
                 A183=c(NA, NA, NA, NA, NA),
                 A240=c(NA, NA, NA, NA, NA),
                 A330=c(NA, NA, NA, NA, NA))

我想使用更大的数据框来填充前一个。较大数据框的结构如下:

df2 <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
                          "NRAS", "TP53", "EGFR"),
                 A183=c(2.3, 3.3, 2.6, 4.7, 1.2, 5.7, 3.4),
                 A240=c(1.3, 2.3, 4.6, 5.7, 2.2, 7.7, 1.4),
                 A330=c(0.3, 2.3, 1.6, 1.7, 4.2, 1.7, 4.4),
                 A335=c(1.3, 0.3, 0.6, 0.7, 0.2, 0.7, 0.4),
                 A345=c(0.3, 4.3, 4.6, 4.7, 4.2, 4.7, 0.4))

我想要的输出应该是这样的:

Hugo_Symbol A183 A240 A330
1      CDKN2A  2.3  1.3  0.3
2         JUN  3.3  2.3  2.3
3        IRS2  2.6  4.6  1.6
4        MTOR  4.7  5.7  1.7
5        NRAS  1.2  2.2  4.2

我尝试使用dplyr包,特别是semi_join()函数,但它返回空表给我。

标签: rdataframepopulate

解决方案


您还可以使用以下解决方案:

library(dplyr)

df %>%
  left_join(df2, by = "Hugo_Symbol") %>%
  mutate(across(ends_with(".x"), ~ coalesce(.x, get(gsub(".x", ".y", cur_column()))))) %>%
  select(Hugo_Symbol, ends_with(".x")) %>%
  rename_with(~ gsub(".x", "", .), ends_with(".x"))

  Hugo_Symbol A183 A240 A330
1      CDKN2A  2.3  1.3  0.3
2         JUN  3.3  2.3  2.3
3        IRS2  2.6  4.6  1.6
4        MTOR  4.7  5.7  1.7
5        NRAS  1.2  2.2  4.2

推荐阅读