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

标签 r dplyr tidyr

这个问题在这里已经有了答案:





Replace column values with column name using dplyr's transmute_all

(4 个回答)


7 个月前关闭。




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

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 方法来做到这一点?

谢谢你的帮助!

最佳答案

一个选项是使用 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

关于使用 R 和 dplyr 按列名替换许多列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50542264/

相关文章:

r - 导出数据框时,R 是否有保留列格式的方法?

r - dplyr:使用列表的对象名称创建列

r - 仅保留 3 列中至少有一列等于给定值的行

r - tidyr:分隔列,同时保留第一列中的分隔符

r - 执行 R 脚本时 MS-SQL 服务器中的 "Invalid BXL stream"

R 错误使用 readHTMLTable

r - 自动将 p 值添加到 facet plot

r - 如何将日期格式(d.m.Y)更改为年份(Y)并查找年度累计总和?

r - 如何在R中对这些数据进行排序

r - 在 r 中将 2 列(从长形式转换为宽形式)扩展为 4 列