首页 > 解决方案 > 使用包含旧行名和新行名的数据框更改行名

问题描述

我有一个数据框(超过 9000 行),其中包含每个细胞簇(列)的某些基因(行)的平均基因表达,现在我需要将基因名称(行名)更改为直系同源物。它看起来像这样:

          Cluster1   Cluster2  Cluster3
[Tppp2]   10.32      0.14      2.56
[Mtx1]    6.32       8.77      0.30
[Vps37c]  225.02     132.87    9.52
[Slc39a9] 52.13      18.42     4.12

我还有另一个数据框(超过 13000 行)包含直向同源物;所述基因名称(旧)-直向同源基因名称(新)。它看起来像这样:

    GeneName    NewGeneName
[1] Vps37c      VPS37C
[2] Tppp2       TPPP3
[3] Slc39a9     SLC39A9
[4] Mtx1        MTX1B

因此,对于第一个数据帧中的每一行,行名将与 in 的名称匹配,dataframe2$GeneName然后将 in 的名称dataframe2$NewGeneName保存为新的行名(或保存在以正确顺序保存所有新行名的向量中)。例如 Tppp2 将是 TPPP3,依此类推,结果如下:

rownames(expr_df) <- c("TPPP3", "MTX1B", "VPS37C", "SLC39A9".

我已经尝试了很多东西,这真的让我很烦恼,我无法让它工作。我不记得我尝试过和失败的所有方法,对不起。

仅供参考:表达数据框的直向同源物和行名的顺序不同,直向同源数据框包含的基因多于表达数据框中的基因。

标签: r

解决方案


一个tidyverse解决方案:

df1 %>% 
  rownames_to_column() %>% 
  left_join(df2, by = c("rowname" = "GeneName")) 

  rowname Cluster1 Cluster2 Cluster3 NewGeneName
1   Tppp2    10.32     0.14     2.56       TPPP3
2    Mtx1     6.32     8.77     0.30       MTX1B
3  Vps37c   225.02   132.87     9.52      VPS37C
4 Slc39a9    52.13    18.42     4.12     SLC39A9

数据

df1 <- tibble::tribble(
         ~Cluster1, ~Cluster2, ~Cluster3,
             10.32,      0.14,      2.56,
              6.32,      8.77,       0.3,
            225.02,    132.87,      9.52,
             52.13,     18.42,      4.12
         )

df1 <- as.data.frame(df1)

rownames(df1) <- c("Tppp2", "Mtx1", "Vps37c", "Slc39a9")

df2 <- tibble::tribble(
         ~GeneName, ~NewGeneName,
          "Vps37c",     "VPS37C",
           "Tppp2",      "TPPP3",
         "Slc39a9",    "SLC39A9",
            "Mtx1",      "MTX1B"
         )

推荐阅读