【问题标题】:Update cell values with the column name using mutate_at使用 mutate_at 使用列名更新单元格值
【发布时间】:2019-01-23 06:24:28
【问题描述】:

我正在处理调查数据。有些问题要求参与者检查适用于他们的所有选项。在我目前拥有的数据框中,每个可能的响应都有一列,如果参与者选择了该选项,则记录值为 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() 调用中访问列名。或者,如果我说错了,也非常欢迎提供另一种方法的指导。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    试试这个:

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

    【讨论】:

      【解决方案2】:

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

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多