【问题标题】:Change column names in R在 R 中更改列名
【发布时间】:2023-02-25 00:12:41
【问题描述】:

我有两个数据框df1df2。我想粘贴到 df1 列名,df2 中的HTO 列内容与df1 中的列名和df2 中的行名相匹配。当df1 中的给定列缺少 HTO 时,粘贴“UN_”。请查看下面的结果示例

df1

        ACG    AGC  ACC  AAC 
gene1   3     2     1    1
gene2   2     1     2    3
gene3   1     1     1    1

df2

      p      HTO
ACG   0.6    HTO1
AGC   0.3    HTO2
AAC   0.05   HTO1

期望的结果

        HTO1_ACG    HTO2_AGC  UN_ACC  HTO1_AAC 
gene1   3     2     1    1
gene2   2     1     2    3
gene3   1     1     1    1

【问题讨论】:

  • 你能提供可重现的数据吗?你可以使用dput。我们应该能够使用您提供的代码创建数据框。

标签: r


【解决方案1】:

base R 中的一种方法是设置布尔索引 idx 并使用 paste0colnames

idx <- colnames(df1) %in% rownames(df2)
# [1]  TRUE  TRUE FALSE  TRUE

colnames(df1)[idx] <- paste0(df2$HTO, "_", colnames(df1[idx]))
colnames(df1)[!idx] <- paste0("UN", "_", colnames(df1)[!idx])

输出:

#       HTO1_ACG HTO2_AGC UN_ACC HTO1_AAC
# gene1        3        2      1        1
# gene2        2        1      2        3
# gene3        1        1      1        1

数据:

df1 <- structure(list(ACG = 3:1, AGC = c(2L, 1L, 1L), ACC = c(1L, 2L, 
1L), AAC = c(1L, 3L, 1L)), row.names = c("gene1", "gene2", "gene3"
), class = "data.frame")

df2 <- structure(list(p = c(0.6, 0.3, 0.05), HTO = c("HTO1", "HTO2", 
"HTO1")), row.names = c("ACG", "AGC", "AAC"), class = "data.frame")

【讨论】:

  • 再加上这个基本的 R 方法,可能是最简单的方法!
【解决方案2】:

您可以使用 match() 查找与 df1 的列对应的 df2 的行。我将 ACC 行添加到数据中。

df1 <- tibble::tribble(
 ~ACG,    ~AGC,  ~ACC,  ~AAC, 
   3,     2,     1,    1,
   2,     1,     2,    3,
   1,     1,     1,    1)
df1 <- as.data.frame(df1)
rownames(df1) <- paste0("gene", 1:3)

df2 <- data.frame(p = c(.6, .3, .05, .1), 
                  HTP = c("HTO1", "HT02", "HT01", "UN"))
rownames(df2) <- c("ACG", "AGC", "AAC", "ACC")

df1 <- setNames(df1, paste(df2$HTP[match(colnames(df1), rownames(df2))], colnames(df1), sep="_"))
df1
#>       HTO1_ACG HT02_AGC UN_ACC HT01_AAC
#> gene1        3        2      1        1
#> gene2        2        1      2        3
#> gene3        1        1      1        1

创建于 2023-02-24 reprex v2.0.2

【讨论】:

    【解决方案3】:

    这是另一种方法,我们融化 df1 然后合并 df2 并转向回宽格式:

    library(data.table)
    
    setDT(df1,keep.rownames = "gene")
    setDT(df2, keep.rownames= "seq")
    
    dcast(
      df2[melt(df1, "gene",variable.name = "seq"), on="seq", .(gene, seq=paste0(fifelse(is.na(HTO), "UN", HTO),"_",seq),value)],
      gene~seq
    )
    

    输出:

        gene HTO1_AAC HTO1_ACG HTO2_AGC UN_ACC
    1: gene1        1        3        2      1
    2: gene2        3        2        1      2
    3: gene3        1        1        1      1
    

    使用 dplyr/tidyr 的类似方法如下:

    library(dplyr)
    library(tidyr)
    left_join(
      pivot_longer(as_tibble(df1,rownames = "gene"), -gene, names_to = "seq"),
      as_tibble(df2, rownames="seq")
    ) %>% 
      mutate(seq = paste0(if_else(is.na(HTO), "UN", HTO),"_", seq)) %>% 
      pivot_wider(id_cols = gene, names_from = seq,values_from = value)
    

    【讨论】:

      【解决方案4】:

      这是另一种方法,首先使用带有rename(any_of()) 的查找向量,然后重命名所有未使用rename_with() 重命名的列。此方法假定所有未重命名的列的名称中都不包含下划线 _

      library(dplyr)
      
      lookup_vec <- setNames(rownames(df2), paste0(df2$HTO, "_", rownames(df2)))
      
      df1 %>% 
        rename(any_of(lookup_vec)) %>% 
        rename_with(~ gsub("(^[^_]*$)", "UN_\1", .x),
                    everything())
      
      #>       HTO1_ACG HTO2_AGC UN_ACC HTO1_AAC
      #> gene1        3        2      1        1
      #> gene2        2        1      2        3
      #> gene3        1        1      1        1
      

      来自 OP 的数据

      df1 <- structure(list(ACG = 3:1, AGC = c(2L, 1L, 1L), ACC = c(1L, 2L, 
                                                                    1L), AAC = c(1L, 3L, 1L)), row.names = c("gene1", "gene2", "gene3"
                                                                    ), class = "data.frame")
      
      df2 <- structure(list(p = c(0.6, 0.3, 0.05), HTO = c("HTO1", "HTO2", 
                                                           "HTO1")), row.names = c("ACG", "AGC", "AAC"), class = "data.frame")
      

      reprex package (v2.0.1) 创建于 2023-02-24

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 2019-02-15
        • 2020-11-13
        相关资源
        最近更新 更多