Поскольку это порядковая переменная, вы можете сделать g1$value
фактором ordered
в качестве соответствующего class
. Затем вы можете использовать такие функции, как min
и max
, как если бы вы были числовыми:
g1$value <- ordered(g1$value, levels = c("fda", "trial", "case", "pre"))
g1$value
#[1] fda trial case case pre
#Levels: fda < trial < case < pre
g1$value <- ave(g1$value, g1$drug, FUN=min)
g1
# drug value
#1 a fda
#2 a fda
#3 a fda
#4 d case
#5 d case
или dplyr говорят:
g1 %>%
mutate(value = ordered(value, levels = c("fda", "trial", "case", "pre"))) %>%
group_by(drug) %>%
mutate(value = min(value))
Порядок в наборе данных и диапазон значений, присутствующих в любой группе drug
, не должны влиять на этот результат:
g2 = data.frame (
drug = c( "a","a","a","d","d","e","e","e"),
value = c("fda","trial","case","case","pre","pre","fda","case")
)
# drug value
#1 a fda
#2 a trial
#3 a case
#4 d case
#5 d pre
#6 e pre
#7 e fda
#8 e case
g2 %>%
mutate(value = ordered(value, levels = c("fda", "trial", "case", "pre"))) %>%
group_by(drug) %>%
mutate(value = min(value))
## A tibble: 8 x 2
## Groups: drug [3]
# drug value
# <fct> <ord>
#1 a fda
#2 a fda
#3 a fda
#4 d case
#5 d case
#6 e fda
#7 e fda
#8 e fda