【问题标题】:R - reorder dataframe keeping first columnR - 重新排序数据框保持第一列
【发布时间】:2020-06-10 22:36:36
【问题描述】:

我有两个数据框

第一个(A):

第一个列是“行名”

                          GTEX-11DXY-0426-SM-5H12R   GTEX-11EQ8-0826-SM-5N9FG [...30]
ENSG00000223972.4                        0                        1
ENSG00000227232.4                      663                      802
ENSG00000243485.2                        0                        1
ENSG00000237613.2                        0                        0
ENSG00000268020.2                        0                        1
ENSG00000240361.1                        3                        0

它继续以相同格式再显示 30 列

我想根据另一个数据框列的顺序对其进行排序,如下所示:

> head(targets10)
# A tibble: 6 x 7
# Groups:   Group [1]
  Sample_Name Grupo_analisis body_site molecular_data_~ sex   Group

1 GTEX-11XUK~              3 Thyroid   RNA Seq (NGS)    fema~ ELI  
2 GTEX-R55G-~              3 Thyroid   RNA Seq (NGS)    fema~ ELI  
3 GTEX-PLZ4-~              3 Thyroid   RNA Seq (NGS)    fema~ ELI  
4 GTEX-14AS3~              3 Thyroid   RNA Seq (NGS)    fema~ ELI  
5 GTEX-14BMU~              3 Thyroid   Allele-Specific~ fema~ ELI  
6 GTEX-13QJC~              3 Thyroid   Allele-Specific~ fema~ ELI  
# ... with 1 more variable: ShortName <fct>

Sample_Name 列与数据框 A 中的列标题具有相同的名称。

我希望它们具有相同的顺序,因此数据框 A 中的第一列是 targets10$Sample_Name 中的第一行

我尝试了以下方法:

library(data.table)
setDT(countdata)
setcolorder(countdata, as.character(coldata$Sample_Name))

它可以工作,但会从数据框中删除我的rownames,我需要它们留下来!!!

请帮帮我

非常感谢

【问题讨论】:

  • 您可以使用keep.rownames 参数来保留行名:setDT(countdata, keep.rownames=TRUE)

标签: r data.table row


【解决方案1】:

不考虑您的数据是 tibbles 并计划成为 data.tables,这适用于普通 data.frames:

A <- data.frame(id = LETTERS, c = rnorm(26), d=rnorm(26), a = 1:26, b = 26:1)
B <- data.frame(sample = c("a", "b", "c", "d"), ignore =rnorm(4))

new.A <- cbind(A$id, A[,B$sample])
head(new.A)

编辑

刚刚意识到 id 不在列中,而是在行名中。使这种方法更容易:

A <- data.frame(c = rnorm(26), d=rnorm(26), a = 1:26, b = 26:1)
rownames(A) <- LETTERS
B <- data.frame(sample = c("a", "b", "c", "d"), ignore =rnorm(4))

new.A <- A[, B$sample]
head(new.A)

【讨论】:

    【解决方案2】:

    你可以这样做:

    dput(dfB$Sample_Name) 会将Sample_Name 列的值打印到您的控制台。然后你可以复制输出,然后做:

    library(dplyr)
    dfA <- dfA %>%
      select("GTEX-11XUK", "GTEX-R55G", etc...)
    

    或者 Gregor 指出的一种不那么老套的方法:

    dfA <- dfA %>%
      select(all_of(dfB$Sample_Name))
    

    【讨论】:

    • dput 复制/粘贴很hacky,你可以使用select(all_of(dfB$Sample_Name))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2013-10-21
    • 2014-03-10
    • 1970-01-01
    • 2019-02-12
    • 2013-07-03
    • 2012-10-01
    相关资源
    最近更新 更多