【问题标题】:set recurring column names in R data frame在 R 数据框中设置重复列名
【发布时间】:2021-02-07 09:51:28
【问题描述】:

我有 2 个数据框 - df "A" 具有唯一的列名;并且 df "B" 具有来自 "A" 的这些唯一列名所属的组。 例如:

> A
 ID1 ID2 ID3 ID4 ID5 ID6 
1 0.5 0.2 0.0 0.6 0.8 0.2 
2 0.1 0.3 0.1 0.4 0.0 0.4 
3 1.2 1.1 1.4 1.5 1.9 1.3 
4 1.1 1.3 1.5 1.9 1.0 1.1 

> B
ID   Group 
ID1  Grp1
ID2  Grp2
ID3  Grp1
ID4  Grp1
ID5  Grp2
ID6  Grp2 

我正在尝试转换“A”的列名,以便它们反映组名,而不是唯一 ID。但是,当我执行此转换时,R 会自动在列名中添加 .1、.2、.. 后缀,这会妨碍我的下游分析。

这是我的代码:

names = colnames(A)
colnames(A) <- as.character(B$Group[match(colnames(A),B$ID)])
counts = table(colnames(A))
to_keep = names(counts)[counts >= 1]
pData <- B[B$Group %in% to_keep,]
to_keep = which(colnames(A) %in% to_keep)   
A <- A[,to_keep]
names <- names[to_keep]

告诉我如何解决这个问题!

谢谢!

编辑:谢谢大家的帮助!在您的帮助下,我设法获得了非唯一的列名。我将在这里解释我的用例,所以也许你会明白我为什么要这样做。

我有一个 df "A" ,这样一些列属于 grp1 ,一些属于 grp2 。 我希望能够生成一个训练集来训练算法。这个集合是通过随机抽取其中一些组并将它们混合起来创建的。 代码是这样的:

names(A) <- B$Group[match(names(A), B$ID)]
counts = table(colnames(A))
training <- as.numeric(unlist(sapply(unique(colnames(A)), function(x) {
  sample(which(colnames(A) %in% x), counts[x]/2) })))

此用例欢迎任何替代方法。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用match

    names(A) <- B$Group[match(names(A), B$ID)]
    A
    #  Grp1 Grp2 Grp1 Grp1 Grp2 Grp2
    #1  0.5  0.2  0.0  0.6  0.8  0.2
    #2  0.1  0.3  0.1  0.4  0.0  0.4
    #3  1.2  1.1  1.4  1.5  1.9  1.3
    #4  1.1  1.3  1.5  1.9  1.0  1.1
    

    但是,列名重复不是一个好习惯。您可以添加一些前缀/后缀来区分列名。也许将原始列名附加到组名?

    names(A) <- paste(B$Group[match(names(A), B$ID)], names(A), sep = '_')
    A
    
    #  Grp1_ID1 Grp2_ID2 Grp1_ID3 Grp1_ID4 Grp2_ID5 Grp2_ID6
    #1      0.5      0.2      0.0      0.6      0.8      0.2
    #2      0.1      0.3      0.1      0.4      0.0      0.4
    #3      1.2      1.1      1.4      1.5      1.9      1.3
    #4      1.1      1.3      1.5      1.9      1.0      1.1
    

    【讨论】:

      【解决方案2】:

      也许是这个?

      names(A) = setNames(B$Group, B$ID)[names(A)]
      

      这是基于您希望 A 中名为“ID1”的列变为名为“Grp1”等等的假设。

      我会保留这个,因为它是与其他答案不同的方法,但我也同意使用非唯一名称不是一个好习惯。

      【讨论】:

        【解决方案3】:

        我们也可以使用

        library(dplyr)
        A <- A %>% 
          rename_at(vars(B$ID), ~ make.unique(B$Group))
        

        -输出

        A
        # Grp1 Grp2 Grp1.1 Grp1.2 Grp2.1 Grp2.2
        #1  0.5  0.2    0.0    0.6    0.8    0.2
        #2  0.1  0.3    0.1    0.4    0.0    0.4
        #3  1.2  1.1    1.4    1.5    1.9    1.3
        #4  1.1  1.3    1.5    1.9    1.0    1.1
        

        【讨论】:

          猜你喜欢
          • 2018-07-13
          • 2018-11-30
          • 1970-01-01
          • 2020-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多