R 使用mutate_at使用列名更新单元格值

R 使用mutate_at使用列名更新单元格值,r,dplyr,mutate,R,Dplyr,Mutate,我正在处理调查数据。有些问题要求参与者检查适用于他们的所有选项。在我目前拥有的数据框中,每个可能的响应都有一列,如果参与者选择了该选项,则记录值为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。例如,对于问题“您在工作中经历过以下哪种情绪?”,在选项“无聊”、“压力”、“满足”下,我的数据框如下所示:

df <- data.frame(
  id = seq(1,3,1),
  boredom = c(NA, 1, NA),
  stress = c(1, 1, 1),
  contentment = c(NA, NA, NA)
)
df2 <- data.frame(
  id = seq(1,3,1),
  boredom = c(NA, 'boredom', NA),
  stress = rep('stress', 3), 
  contentment = rep(NA, 3)
)
df_updated <- df %>% 
  mutate_at(vars(boredom:stress), funs(ifelse(. == 1, 'relevant column name', .)))
df试试这个:

df %>% mutate_at(vars(boredom:stress), funs(ifelse(. == 1, deparse(substitute(.)), .)))

另一个选项是将数据从宽转换为长,然后根据需要更改值,然后再重新整形为宽

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>
df%>%
聚集(键,val,-id)%>%
变异(val=ifelse(val==1,key,val))%>%
排列(键,值)%>%
选择(名称(df))
#无聊压力满足感
#1.1压力
#2.无聊压力
#3.3压力