如何重复时,如何根据优先级重新分类/替换值
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
。然后你可以使用像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
以上是关于如何重复时,如何根据优先级重新分类/替换值的主要内容,如果未能解决你的问题,请参考以下文章