Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 当存在重复时,如何基于优先级重新分类/替换值_R_Dplyr_Plyr_R Factor - Fatal编程技术网

R 当存在重复时,如何基于优先级重新分类/替换值

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 &

我有一个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 > 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