簡體   English   中英

基於另一個數據框中的列但具有非唯一值的數據框中的行重新排序

[英]Reorder rows in a dataframe based on column in another dataframe but with non-unique values

我有 2 個數據框。

第一個數據幀 df1 有 1246 行,如下所示:

                 gene1         gene2          gene3
AAAB.P1           1.23          2.28          -2.85
AABC.P1           4.06         -0.59          -2.42
ABCD.P1           3.26          2.19          -3.01
ABCD.R1           1.23          0.15          -2.30
DBCA.P1           1.67         -0.51          -3.24

第二個數據幀 df2 也有 1246 行,如下所示:

    id      primary_diagnosis
1   ABCD    carcinoma
2   ABCD    carcinoma
3   AAAB    AS
4   DBCA    carcinoma
5   EFGH    other
6   LMNO    AS

我需要根據 id 列重新排列第二個 df,使其與第一個 df 的順序相同。 我試着用

df2<-df2[order(match(df2$id, substr(rownames(df1), 1, 4))), ]

但它只給了我 21 行處於正確位置的行。 我認為問題在於 df2 包含一些重復項。 例如,ABCD 在 df1 中同時具有 ABCD.P1 和 ABCD.R1,但在 df2 中只有一個條目。 它們進入哪個順序並不重要,因為 P1 和 R1 都會與癌相匹配。 如何重新排序 df2 以匹配 df1 已經存在的任何順序?

我們可以這樣使用簡單的arrange

library(dplyr)

df2 %>% 
  arrange(id, df1$id)
    id primary_diagnosis
3 AAAB                AS
1 ABCD         carcinoma
2 ABCD         carcinoma
4 DBCA         carcinoma
5 EFGH             other
6 LMNO                AS
#df1
df1 <- structure(list(gene1 = c(1.23, 4.06, 3.26, 1.23, 1.67), gene2 = c(2.28, 
-0.59, 2.19, 0.15, -0.51), gene3 = c(-2.85, -2.42, -3.01, -2.3, 
-3.24)), class = "data.frame", row.names = c("AAAB.P1", "AABC.P1", 
"ABCD.P1", "ABCD.R1", "DBCA.P1"))

#df2
df2 <- structure(list(id = c("ABCD", "ABCD", "AAAB", "DBCA", "EFGH", 
"LMNO"), primary_diagnosis = c("carcinoma", "carcinoma", "AS", 
"carcinoma", "other", "AS")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

您可以使用df2[rank(rownames(df1), ties.method = "random"), ]

ties.method = "random"參數確保在存在平局的情況下每個排名都是唯一的。

這個怎么樣:

df1 <- read.table(text = "id gene1 gene2 gene3
AAAB.P1 1.23 2.28 -2.85
AABC.P1 4.06 -0.59 -2.42
ABCD.P1 3.26 2.19 -3.01
ABCD.R1 1.23 0.15 -2.30
DBCA.P1 1.67 -0.51 -3.24", sep=" ", header=TRUE)
rownames(df1) <- df1$id
df1 <- df1[,-1]


df2 <- read.table(text="id primary_diagnosis
ABCD carcinoma
ABCD carcinoma
AAAB AS
DBCA carcinoma
EFGH other
LMNO AS", sep=" ", header=TRUE)


df2[match(substr(rownames(df1), 1, 4), df2$id), ]
#>       id primary_diagnosis
#> 3   AAAB                AS
#> NA  <NA>              <NA>
#> 1   ABCD         carcinoma
#> 1.1 ABCD         carcinoma
#> 4   DBCA         carcinoma

reprex 包於 2022-05-23 創建 (v2.0.1)

暫無
暫無

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

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