代码之家  ›  专栏  ›  技术社区  ›  89_Simple

提取满足条件的每行的列名[重复]

  •  3
  • 89_Simple  · 技术社区  · 6 年前

    这个问题已经有了答案:

    d <- structure(
      list(
        Cl = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
        SaCl = c(0, 1, 0, 0,0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0), 
        SiCl = c(0L,0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,0L, 0L, 0L), 
        ClLo = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
        SiClLo = c(0L, 0L, 0L,0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
        SaClLo = c(1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1), 
        SaLo = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
        SaSiLo = c(0L, 0L,0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
        SiLo = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
        LoSa = c(0L, 0L, 0L, 0L,0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
        Sa = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,0L, 0L, 0L, 0L, 0L, 0L, 0L)
      ), 
      row.names = c(NA, 20L),
      class = "data.frame"
    )
    

    每行只有一个 1 . 我想提取列名,每行有一个列名,这样我的数据框看起来就像

    row.id | names
    -------+-------
         1 | SaClLo
         2 | SaCl
         3 | SaClLo
         4 | SaClLo
    

    我试图对每一行运行一个函数

    apply(d, 1, function(x) colnames(x)[x == 1])
    

    这是给我的 NULL .

    3 回复  |  直到 6 年前
        1
  •  4
  •   markus    6 年前

    使用 max.col 找到 1 并使用该向量选择相应的列名称。

    data.frame(row.id = 1:nrow(d),
               names = names(d)[max.col(d)])
    #   row.id  names
    #1       1 SaClLo
    #2       2   SaCl
    #3       3 SaClLo
    #4       4 SaClLo
    #...
    
        2
  •  1
  •   divibisan    6 年前

    对于每一行,我们找到哪一列的值为1,然后选择 colnames 为了那一排。然后我们把它转换成一个data.frame。

    data.frame(names = apply(d, 1, function(x) colnames(d)[which(x == 1)]))
    
        names
    1  SaClLo
    2    SaCl
    3  SaClLo
    4  SaClLo
    ...
    

    或者,您可以运行它 tibble::rowname_to_column() 改变 row.id 从行名称到列。

    data.frame(names = apply(d, 1, function(x) colnames(d)[which(x == 1)])) %>%
        tibble::rownames_to_column()
    
       rowname  names
    1        1 SaClLo
    2        2   SaCl
    3        3 SaClLo
    4        4 SaClLo
    ...
    
        3
  •  1
  •   user3603486    6 年前

    一个鲜为人知的特征 which 你的朋友是:

    > which(d==1, arr.ind=TRUE)
       row col
    2    2   2
    11  11   2
    15  15   2
    13  13   4
    ...
    

    第二列是您需要的信息:

    > arr_indices <- which(d == 1, arr.ind = TRUE)
    > colnames(d)[ arr_indices[, 2] ]
     [1] "SaCl"   "SaCl"   "SaCl"   "ClLo"   "SaClLo" "SaClLo" "SaClLo" "SaClLo"
     [9] "SaClLo" "SaClLo" "SaClLo" "SaClLo" "SaClLo" "SaClLo" "SaClLo" "SaClLo"
    [17] "SaClLo" "SaClLo" "SaClLo" "SaClLo"
    

    你可以把它放进一个数据框架或者其他什么东西。我喜欢这个答案,因为它相对容易阅读代码。