代码之家  ›  专栏  ›  技术社区  ›  Loz

如果满足条件,则覆盖变量,否则保留现有值R

  •  0
  • Loz  · 技术社区  · 2 年前

    我有一个数据框

    df<-data.frame(Name=c('H001', 'H002', 'H003', 'H004', 'H005', 'H006',
                          'H007', 'H008', 'H009', 'H010'),
                   Var1=c(1:10),
                   Var2=c(4,6,7,2,3,8,9,3,2,10),
                   Var3=c(1,0.7,0.5,0.74,0.84,0.8,0.13,0.7,0.34,0.4))
    

    如果Var3列中的原始值高于给定阈值,我想减少它,但如果它低于所述阈值,则保留原始值。我已经试过了,但这会导致NAs:

    df %>% 
      mutate(Var3 = case_when(
        Name %in% c("H001", "H002") & Var3 >0.32 ~ 0.32,
        Name %in% c("H003", "H004") & Var3 >0.22 ~ 0.32,
        Name %in% c("H005", "H006") & Var3 >0.15 ~ 0.15,
        Name %in% c("H007", "H008") & Var3 >0.18 ~ 0.18,
        Name %in% c("H009", "H010") & Var3 >0.42 ~ 0.32,
      ))
    

    有没有办法保留原始值而不是NA?提前谢谢

    1 回复  |  直到 2 年前
        1
  •  1
  •   AndrewGB    2 年前

    你可以加一个期末考试 else 在演讲结束时发表声明 case_when ,这样,如果其他条件都不满足,它就会返回 Var3 对于给定的行。默认情况下,它将返回 NA 如果其他条件都不满足。

    df %>% 
      mutate(Var3 = case_when(
        Name %in% c("H001", "H002") & Var3 >0.32 ~ 0.32,
        Name %in% c("H003", "H004") & Var3 >0.22 ~ 0.32,
        Name %in% c("H005", "H006") & Var3 >0.15 ~ 0.15,
        Name %in% c("H007", "H008") & Var3 >0.18 ~ 0.18,
        Name %in% c("H009", "H010") & Var3 >0.42 ~ 0.32,
        TRUE ~ Var3
      ))
    

    输出

       Name Var1 Var2 Var3
    1  H001    1    4 0.32
    2  H002    2    6 0.32
    3  H003    3    7 0.32
    4  H004    4    2 0.32
    5  H005    5    3 0.15
    6  H006    6    8 0.15
    7  H007    7    9 0.13
    8  H008    8    3 0.18
    9  H009    9    2 0.34
    10 H010   10   10 0.40