我正在处理调查数据。一些问题要求参与者检查适用于他们的所有选项。在我当前拥有的数据框中,对于每个可能的响应都有一列,如果参与者选择了该选项,则记录为1。例如,对于“您在工作中经历了以下哪些情感?”这个问题,选择了“乏味”,“压力”,“知足”,我的数据框将如下所示:
df <- data.frame(
id = seq(1,3,1),
boredom = c(NA, 1, NA),
stress = c(1, 1, 1),
contentment = c(NA, NA, NA)
)
我想用列名更新等于1的所有单元格值,以便有一个如下所示的数据框:
df2 <- data.frame(
id = seq(1,3,1),
boredom = c(NA, 'boredom', NA),
stress = rep('stress', 3),
contentment = rep(NA, 3)
)
然后,我可以使用dplyr :: unite创建一列,以将参与者报告的所有情绪存储在一个列中。
我的直观方法是使用mutate_at和ifelse(),但是我不知道如何在对ifelse()的调用中引用列的名称。例如,我想写这样的东西:
df_updated <- df %>%
mutate_at(vars(boredom:stress), funs(ifelse(. == 1, 'relevant column name', .)))
我希望有人可以告诉我如何在ifelse()调用中访问列名。或者,如果我吠错了树,也非常欢迎您提供另一种方法的指导。
答案 0 :(得分:2)
尝试一下:
df %>% mutate_at(vars(boredom:stress), funs(ifelse(. == 1, deparse(substitute(.)), .)))
答案 1 :(得分:1)
另一种选择是将数据从宽转换为长,然后根据需要更改值,然后再次重新调整为宽。
df %>%
gather(key, val, -id) %>%
mutate(val = ifelse(val == 1, key, val)) %>%
spread(key, val) %>%
select(names(df))
# id boredom stress contentment
#1 1 <NA> stress <NA>
#2 2 boredom stress <NA>
#3 3 <NA> stress <NA>