条件更改或不更改组中的所有变量

Ale*_*der 4 r dplyr

我可能有一个非常简单的问题,即如果某些条件得到满足,则根据clasdf的变量调用变量.如果不满足条件,不要改变任何东西.

V <- seq(10,50,10)
gr = rep(seq(1,2),each=5)
clas=c("Normal","Abnormal","Fair","Fair","Normal","Fair","Normal","Normal","Abnormal","Fair")

df <- data.frame(V,gr,clas)

   #      V gr     clas
   #  1  10  1   Normal
   #  2  20  1 Abnormal
   #  3  30  1     Fair
   #  4  40  1     Fair
   #  5  50  1   Normal
   #  6  10  2     Fair
   #  7  20  2   Normal
   #  8  30  2   Normal
   #  9  40  2 Abnormal
   #  10 50  2     Fair
Run Code Online (Sandbox Code Playgroud)

我想设置clas列所有Normal如果显示的值Normal时, V=20V=30每个小组.如果这种情况不满意,则无需更改该组.

预期产出

df_modif
   #      V  gr    clas
   #  1  10  1   Normal
   #  2  20  1 Abnormal
   #  3  30  1     Fair
   #  4  40  1     Fair
   #  5  50  1   Normal
   #  6  10  2   Normal
   #  7  20  2   Normal
   #  8  30  2   Normal
   #  9  40  2   Normal
   #  10 50  2   Normal
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

基于OP的描述

library(dplyr)
df %>%
    group_by(gr) %>% 
    mutate(clas = as.character(clas),
           clas = if(any(clas =="Normal" & V ==20) & 
                     any(clas=="Normal" & V==30)) "Normal"
                 else clas)
#       V    gr     clas
#   (dbl) (int)    (chr)
#1     10     1   Normal
#2     20     1 Abnormal
#3     30     1     Fair
#4     40     1     Fair
#5     50     1   Normal
#6     10     2   Normal
#7     20     2   Normal
#8     30     2   Normal
#9     40     2   Normal
#10    50     2   Normal
Run Code Online (Sandbox Code Playgroud)

同样可以实现 data.table

library(data.table)
setDT(df)[df[,  .I[any(clas == "Normal" & V == 20) &
     any(clas == "Normal" & V ==30)], gr]$V1, clas := factor("Normal")]
Run Code Online (Sandbox Code Playgroud)