基于R中若干条件的因子变量水平替换

7nbnzgx9  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(135)

我有一个4级(阶段2、阶段1、升高、正常)长格式 Dataframe 中的因子变量(类别),我想用每个ID一个级别(新类别)替换。
条件:
如果在连续的行中有〉=2个“阶段2”,我希望该级别仅为阶段2。
如果没有,但有〉=2 '阶段1'在连续的行,我希望水平是阶段1只。
如果没有,但有〉=2 '提高'在连续行,我希望水平只提高。
如果没有,但有〉=2 '正常'在连续的行,我希望水平是正常的。
如果每个ID没有两个连续的相同级别-我希望该级别是每个ID中出现频率最高的级别。
如果所有级别只出现一次-我希望该级别是可用的最高级别。(级别的顺序从最高到最低-阶段2,阶段1,升高,正常)。
下面是我的数据示例:

ID <- c(3, 3, 3, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10)
Category <- c("elevated", "elevated", "stage 2", "stage 1", "normal", "normal",
              "stage 1", "stage 1", "stage 1", "stage 2", "stage 2", "elevated",
              "stage 1", "elevated", "stage 1", "elevated", "stage 2", "stage 1", 
              "elevated")
df1 <- data.frame(ID, Category)

这是我希望它看起来像:

我希望这是有意义的,谢谢你的任何帮助!!

qoefvg9y

qoefvg9y1#

我们可能需要group_by ID,然后使用一个复杂的case_when语句。理解如何处理which_max调用中的关系仍然很重要。此输出与所需的不同,因为我相信您可能有不同的建议来处理最后一个条件中“最频繁”的关系。

library(dplyr)

df1 %>%
    group_by(ID) %>%
    mutate(New.Category = case_when(any(Category == lag(Category) & Category == "stage 2") ~ "stage 2",
                                    any(Category == lag(Category) & Category == "elevated") ~ "elevated",
                                    any(Category == lag(Category) & Category == "normal") ~ "normal",
                                    .default = names(which.max(table(Category))))) %>%
    ungroup()

# A tibble: 19 × 3
      ID Category New.Category
   <dbl> <chr>    <chr>       
 1     3 elevated elevated    
 2     3 elevated elevated    
 3     3 stage 2  elevated    
 4     6 stage 1  normal      
 5     6 normal   normal      
 6     6 normal   normal      
 7     7 stage 1  stage 1     
 8     7 stage 1  stage 1     
 9     7 stage 1  stage 1     
10     8 stage 2  stage 2     
11     8 stage 2  stage 2     
12     8 elevated stage 2     
13     9 stage 1  elevated    
14     9 elevated elevated    
15     9 stage 1  elevated    
16     9 elevated elevated    
17    10 stage 2  elevated    
18    10 stage 1  elevated    
19    10 elevated elevated

相关问题