【问题标题】:Multiple columns in a data set into one column using R使用R将数据集中的多列合并为一列
【发布时间】:2026-01-30 16:50:01
【问题描述】:

我有以下数据框:

dF
    x     y     z     w
  <lgl> <lgl> <lgl> <lgl>
1  TRUE FALSE  TRUE FALSE
2  TRUE FALSE  TRUE FALSE
3  TRUE FALSE  TRUE FALSE

我想创建一个新列,它为每一行存储等于 TRUE 的列,例如第 1 行将是 c(x,z)(例如字符格式)。

在 R 中想要得到以下输出

x     y     z     w          new
 
TRUE FALSE  TRUE FALSE     x,z
TRUE TRUE  TRUE FALSE      X,Y,Z
FALSE FALSE  TRUE TRUE      Z,W

我已经尝试了堆栈溢出的代码之一,但我得到了列表形式的结果,即:c(x,z) 但我想要 x,z 请指导我 谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    这也可以通过paste0()which() 实现:

    #Data
    df <- data.frame(x=rep(T,3),
                     y=rep(F,3),
                     z=rep(T,3),
                     w=c(T,F,T))
    #Apply
    df$Var <- apply(df,1,function(x) paste0(names(x)[which(x==T)],collapse = ','))
    

    输出:

         x     y    z     w   Var
    1 TRUE FALSE TRUE  TRUE x,z,w
    2 TRUE FALSE TRUE FALSE   x,z
    3 TRUE FALSE TRUE  TRUE x,z,w
    

    【讨论】:

      【解决方案2】:

      我们可以使用 apply 在基于逻辑向量的子集后循环遍历行 (MARGIN = 1)、paste 元素 (names) (toString => paste(..., collapse=", "))

      df1$new <- apply(df1, 1, FUN = function(x) toString(names(x)[x]))
      df1
      #      x     y    z     w     new
      #1  TRUE FALSE TRUE FALSE    x, z
      #2  TRUE  TRUE TRUE FALSE x, y, z
      #3 FALSE FALSE TRUE  TRUE    z, w
      

      或者使用tidyverse,我们可以重新整形为'long'格式(pivot_longer)并通过(row_number()),paste进行分组

      library(dplyr)
      library(tidyr)
      df1 %>%
           mutate(rn = row_number()) %>%
           pivot_longer(cols = -rn) %>%
           group_by(rn) %>% 
           summarise(new = toString(name[value])) %>% 
           select(-rn) %>%
           bind_cols(df1, .)
      

      或者另一个选项是c_across

      df1 %>%
          rowwise %>% 
          mutate(new = toString(names(.)[c_across(everything())]))
      # A tibble: 3 x 5
      # Rowwise: 
      #  x     y     z     w     new    
      #  <lgl> <lgl> <lgl> <lgl> <chr>  
      #1 TRUE  FALSE TRUE  FALSE x, z   
      #2 TRUE  TRUE  TRUE  FALSE x, y, z
      #3 FALSE FALSE TRUE  TRUE  z, w   
      

      数据

      df1 <- structure(list(x = c(TRUE, TRUE, FALSE), y = c(FALSE, TRUE, FALSE
      ), z = c(TRUE, TRUE, TRUE), w = c(FALSE, FALSE, TRUE)),
      class = "data.frame", row.names = c("1", 
      "2", "3"))
      

      【讨论】: