【问题标题】:Replace value by column name for many columns using R and dplyr [duplicate]使用 R 和 dplyr 用列名替换许多列的值 [重复]
【发布时间】:2018-11-05 14:59:14
【问题描述】:

我正在转换调查结果,包括多项选择响应。原始数据如下所示:

df <- data_frame(
  id = c("a", "b", "c"),
  tired = c(T, F, T),
  lonely = c(F, F, T),
  excited = c(F, T, T)
)

df
# A tibble: 3 x 4
  id    tired lonely excited
  <chr> <lgl> <lgl>  <lgl>  
1 a     TRUE  FALSE  FALSE  
2 b     FALSE FALSE  TRUE   
3 c     TRUE  TRUE   TRUE   

我想创建一个新列“feelings”,其中包含受访者表达的感受的逗号分隔值:

  id    feelings              
  <chr> <chr>                 
1 a     tired, excited        
2 b     excited               
3 c     tired, lonely, excited

中间步骤是将 TRUE 值替换为相应的列名称,以产生:

  id    tired  lonely   excited
  <chr> <lgl>  <lgl>    <lgl>  
1 a     tired          excited  
2 b                    excited   
3 c     tired  lonely  excited   

对于单个列,这很简单。但是,与示例不同,我的数据框中有很多列(10+,通常不超过一个或两个 TRUE 值),因此我想为许多列自动执行此操作。一种解决方案可能是遍历列并使用基本子集和替换,但是否还有一种优雅的 dplyr/tidy 方法可以做到这一点?

感谢您的帮助!

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    一种选择是使用tidyr::gather,然后使用dplyr 进行汇总:

    library(dplyr)
    library(tidyr)
    df %>% gather(feelings, value, -id) %>%  #Change to long format
      filter(value) %>%  #Filter for value which are TRUE
      group_by(id) %>%
      summarise(feelings= paste0(feelings,collapse=","))  
    
    # id    feelings
    # <chr> <chr>               
    # 1 a     tired               
    # 2 b     excited             
    # 3 c     tired,lonely,excited
    

    【讨论】:

      猜你喜欢
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多