R 当存在重复时,如何基于优先级重新分类/替换值
我有一个df,其中R 当存在重复时,如何基于优先级重新分类/替换值,r,dplyr,plyr,r-factor,R,Dplyr,Plyr,R Factor,我有一个df,其中值指示药物的状态: 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 因此,对于药物,我想根据值的以下优先级顺序替换任何重复的药物: fda > trial &
值
指示药物的状态
:
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
因此,对于药物,我想根据值
的以下优先级顺序替换任何重复的药物
:
fda > trial > case > pre
因此,例如,如果药物d既是“病例”又是“前期”,所有d的发病率都将被重新归类为“病例”。最后一张表应该是这样的
drug value
1 a fda
2 a fda
3 a fda
4 d case
5 d case
如何做到这一点,而不必循环使用每种药物,先找出优先顺序,然后再替换?使用map
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
mapvect=c(1,2,3,4)
名称(mapvect)=c('pre'、'case'、'trial'、'fda')
g1$helpkey=mapvect[g1$value]
g1%>%group_by(药物)%>%RANGE(值)%>%dplyr::mutate(值=值[helpkey==max(helpkey)])
#一个tibble:5x3
#组别:药物[2]
药物价值帮助键
1食品和药物管理局2
2D案例2
3 a fda 4
4 d案例1
5 a fda 3
与@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"]
g1$value由于这是一个顺序变量,您可以将g1$value
作为一个有序的
因子作为相应的类
。然后,您可以像使用数字一样使用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
数据集中的顺序和任何药物组中存在的值范围不应影响该结果:
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
g2=data.frame(
药物=c(“a”、“a”、“a”、“d”、“d”、“e”、“e”),
值=c(“fda”、“试验”、“案例”、“案例”、“预”、“预”、“fda”、“案例”)
)
#药物价值
#1食品和药物管理局
#2审判
#3一个案例
#4 d案例
#5日前
#6 e预科
#7 e食品和药物管理局
#8 e案件
g2%>%
变异(值=有序(值,水平=c(“fda”,“试验”,“病例”,“预”)))%>%
组(药物)%>%
变异(值=最小值)
##一个tibble:8x2
##组别:药物[3]
#药物价值
#
#1食品和药物管理局
#食品和药物管理局
#美国食品和药物管理局
#4 d案例
#5D案例
#6 e食品和药物管理局
#7 e食品和药物管理局
#8 e食品和药物管理局
使用dplyr::mutate(value=case_when(…))
;这是大量现有问题的重复。可能是@smci-imho的重复。这不是重复。把它当作一个序数变量来处理似乎比写几个case-when语句更直截了当。@thelatemail:是的,它肯定是一堆存在的问题;有和。我已经涉猎了一段时间,唯一的问题是什么是最好的欺骗目标。你能选一个吗?@smci-这里的3个答案都没有使用case_when或if else,因此我认为逻辑与基本上只需在设置有序变量后按组进行一分钟的逻辑并不匹配。可能会有一场比赛,但我没有太多的运气找到非常好的东西-是一个类似的想法,但不完全。这是伟大的,工作得很好。我特别喜欢第一个例子,因为它只需要基本的R,这很有意义。尽管有很多类似的问题我找不到一个能回答我所需要的问题,但我还是回答了上面关于DUP的问题。这不如@thelatemail的回答好,它创建了一个无序因子,并依赖于数据帧中按顺序出现的所需值顺序;如果不发生这种情况,它就会崩溃。更好的方法是使用min
进行分类排序。您不需要创建助手列,您不能直接对min(value)
进行操作吗?无论如何,如果确实创建了它,您希望删除帮助器列%%>%select(-helpkey)
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