这个问题在这里已经有了答案:
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/