【问题标题】:How to mutate conditionally, while keeping original values intact in dplyr?如何有条件地变异,同时在 dplyr 中保持原始值不变?
【发布时间】:2021-11-16 07:34:14
【问题描述】:

我正在处理我在 R 中的第一个数据集,如果这是一个愚蠢的问题,请原谅,但我已经为此苦苦挣扎了好几天。

我的数据如下所示:

library(tidyverse)
tb1 <- tibble(ID = c(1,2,3,4,5),
       Quest_MF_1_1 = c(1,2,2,1,2),
       Quest_MF_1_2 = c(1,2,2,1,2),
       Quest_MF_2_1 = c(2,3,3,2,1),
       Quest_MF_2_2 = c(1,3,4,1,2),
       Quest_MV_1_1 = c(1,2,4,1,2),
       Quest_MV_1_2 = c(1,2,2,1,2),
       Quest_MV_2_1 = c(2,3,5,2,2),
       Quest_MV_2_2 = c(1,3,4,1,2))

tb_long <- tb1 %>%  pivot_longer(
  cols = 2:8,  
  names_to = c("Questionnaire", "Question", "Timepoint"),
names_pattern = "Quest_(.*)_(.*)_(.*)",
values_to = "score")

我想重新编码 MF_2 和 MV_1 的所有分数(5=1、4=2、3=3、2=4、1=5),同时保持其他值不变。我尝试将mutateif_else 结合起来,但我无法弄清楚如何保持其他问题的分数不变。关于如何做到这一点的任何想法?

在我的实际数据集中,我有两个问卷,每个问卷有 20 个和 30 个问题,在 20 个不同的时间点进行测量。对于每份问卷中大约一半的问题,我需要重新编码 te 分数。

【问题讨论】:

  • 是否应该在长数据集上完成

标签: r if-statement conditional-formatting dplyr recode


【解决方案1】:

在长数据中,我们可以使用case_when

tb_long2 <- tb_long %>%
     mutate(score = case_when((Questionnaire == "MF" & Question == 2) |
      (Questionnaire == "MV" & Question == 1) ~ 6- score, TRUE ~ score))

-输出

tb_long2
# A tibble: 35 x 6
      ID Quest_MV_2_2 Questionnaire Question Timepoint score
   <dbl>        <dbl> <chr>         <chr>    <chr>     <dbl>
 1     1            1 MF            1        1             1
 2     1            1 MF            1        2             1
 3     1            1 MF            2        1             4
 4     1            1 MF            2        2             5
 5     1            1 MV            1        1             5
 6     1            1 MV            1        2             5
 7     1            1 MV            2        1             2
 8     2            3 MF            1        1             2
 9     2            3 MF            1        2             2
10     2            3 MF            2        1             3
# … with 25 more rows

【讨论】:

    【解决方案2】:
    library(dplyr, warn.conflicts = FALSE)
    tb1 <- tibble(ID = c(1,2,3,4,5),
           Quest_MF_1_1 = c(1,2,2,1,2),
           Quest_MF_1_2 = c(1,2,2,1,2),
           Quest_MF_2_1 = c(2,3,3,2,1),
           Quest_MF_2_2 = c(1,3,4,1,2),
           Quest_MV_1_1 = c(1,2,4,1,2),
           Quest_MV_1_2 = c(1,2,2,1,2),
           Quest_MV_2_1 = c(2,3,5,2,2),
           Quest_MV_2_2 = c(1,3,4,1,2))
    
    tb1 %>% 
      mutate(across(starts_with('Quest_MV_1') | starts_with('Quest_MF_2'), 
                    ~ recode(.x, '5' = 1, '4' = 2, '3' = 3, '2' = 4, '1' = 5)))
    #> # A tibble: 5 × 9
    #>      ID Quest_MF_1_1 Quest_MF_1_2 Quest_MF_2_1 Quest_MF_2_2 Quest_MV_1_1
    #>   <dbl>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
    #> 1     1            1            1            4            5            5
    #> 2     2            2            2            3            3            4
    #> 3     3            2            2            3            2            2
    #> 4     4            1            1            4            5            5
    #> 5     5            2            2            5            4            4
    #> # … with 3 more variables: Quest_MV_1_2 <dbl>, Quest_MV_2_1 <dbl>,
    #> #   Quest_MV_2_2 <dbl>
    

    reprex package (v2.0.1) 于 2021 年 9 月 22 日创建

    【讨论】:

    • 谢谢!所以在旋转之前重新编码会更好吗?
    【解决方案3】:
    tb1[, 2:8] <- 6 - tbl[, 2:8])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      相关资源
      最近更新 更多