使用R和dplyr替换多列的值为列名

5

我正在将一份包含多项选择回答的调查结果进行转换。原始数据如下:

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   

我想创建一个名为“感受”的新列,其中包含被调查者表达的感受的逗号分隔值:
  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方法来处理呢?

感谢您的帮助!

1个回答

6
一种选择是使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接