如何重复时,如何根据优先级重新分类/替换值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何重复时,如何根据优先级重新分类/替换值相关的知识,希望对你有一定的参考价值。

我有一个df,其中value表示drug的状态:

g1 = data.frame ( 
    drug = c('a','a','a','d','d'),
    value = c('fda','trial','case','case','pre')
)

drug value
1    a   fda
2    a trial
3    a  case
4    d  case
5    d   pre

所以对于药物,我想根据drug的以下优先顺序替换任何重复的value

fda > trial > case > pre 

因此,例如,如果药物d是“病例”以及“前”,则d的所有发生率将被重新归类为“病例”。决赛桌应该是这样的。

  drug value
1    a   fda
2    a   fda
3    a   fda
4    d  case
5    d  case

如何做到这一点,而不必循环通过每种药物,先找出优先权然后更换?

答案

类似于@ Wen-Ben的回答,使用base函数你也可以这样做:

g1$value <- factor(g1$value, levels = c("fda", "trial", "case", "pre"))
g1 <- g1[order(g1$value),]
g1$value <- g1[match(g1$drug, g1$drug), "value"]
另一答案

使用地图vector更新,我以前做的,因为我不想更改列类型。

mapvect=c(1,2,3,4)
names(mapvect)=c('pre','case','trial','fda')
g1$helpkey=mapvect[g1$value]

g1 %>% group_by(drug) %>% arrange(value)%>% dplyr::mutate(value=value[helpkey==max(helpkey)])
# A tibble: 5 x 3
# Groups:   drug [2]
drug value helpkey
<chr> <chr>   <dbl>
1     a   fda       2
2     d  case       2
3     a   fda       4
4     d  case       1
5     a   fda       3
另一答案

由于这是一个序数变量,你可以使g1$value成为ordered因子作为相应的class。然后你可以使用像minmax这样的函数,就像你可以使用数字一样:

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 

以上是关于如何重复时,如何根据优先级重新分类/替换值的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL中怎么替换某个字段值的空白值替换为特定值

如何将活动值传递给片段[重复]

如何根据列的值对观察值重新编号[重复]

如何根据优先级重新排列列表视图中的项目?

重新加载片段

替换两个不同的片段后,按下后​​退按钮时会重新创建第一个片段