簡體   English   中英

使用列表中的匹配項或部分匹配項重命名數據框中的 row.name

[英]Rename row.name in data frame using matches or partial matches from a list

我在 R 中有一個包含 341 行的數據框。 我想使用包含 349 個名稱的列表重命名行名稱。 所有 341 個名字都肯定會出現在這個列表中。 但並非所有這些都會是完美的命中。 數據看起來像這樣

rownames(df_RPM1)
[1] "LQNS02059392.1_11686_5p"
[2] "LQNS02277998.1_30984_3p"
[3] "LQNS02277998.1_30984_5p"
[4] "LQNS02277998.1_30988_3p"
[5] "LQNS02277998.1_30988_5p"
[6] "LQNS02277997.1_30943_3p"
[7] "miR-9|LQNS02278070.1_31740_3p"
[8] "miR-9|LQNS02278094.1_36129_3p" 

head(inlist)
[1] "dpu-miR-2-03_LQNS02059392.1_11686_5p"  "dpu-miR-10-P2_LQNS02277998.1_30984_3p"
[3] "dpu-miR-10-P2_LQNS02277998.1_30984_5p" "dpu-miR-10-P3_LQNS02277998.1_30988_3p"
[5] "dpu-miR-10-P3_LQNS02277998.1_30988_5p" "miR-9|LQNS02278070.1_31740_3p" 
[6] "miR-9|LQNS02278094.1_36129_3p" 

兩者的順序不一定相同。

誰能建議我如何在 R 中做到這一點? 非常感謝

很大程度上取決於“非完美打擊”的樣子。 假設行名是真實姓名的子字符串, str_detect()就可以很好地完成這項工作:

library(tidyverse)
real_names <- c("dpu-miR-2-03_LQNS02059392.1_11686_5p",
                  "dpu-miR-10-P2_LQNS02277998.1_30984_3p",
                  "dpu-miR-10-P2_LQNS02277998.1_30984_5p",
                  "dpu-miR-10-P3_LQNS02277998.1_30988_3p",
                  "dpu-miR-10-P3_LQNS02277998.1_30988_5p",
                  "miR-9|LQNS02278070.1_31740_3p",
                  "miR-9|LQNS02278094.1_36129_3p")

str_which(real_names, "LQNS02059392.1_11686_5p")
#> [1]  1

所以我們可以矢量化(我刪除了示例列表中沒有的元素 6):

pos <- map_int(rownames(df_RPM1), ~ str_which(real_names, fixed(.)))
pos
#> [1] 1 2 3 4 5 6 7

剩下的就是更改行名稱:

rownames(df_RPM1) <- real_names[pos]

當然,如果不完美的命中意味着更復雜的事情,您可能需要根據行名稱或類似內容創建正則表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM