Ifelse:将3个类别合并为一个

shi*_*iny 2 if-statement r

使用此data.frame:

df <- read.table(text = c("
ID  cat1    cat2    cat3
site1   High    High    High
site1   High    High    Medium
site1   High    High    Low
site1   High    Medium  High
site1   High    Medium  Medium
site1   High    Medium  Low
site1   High    Low High
site1   High    Low Medium
site1   High    Low Low
site1   Medium  High    High
site1   Medium  High    Medium
site1   Medium  High    Low
site1   Medium  Medium  High
site1   Medium  Medium  Medium
site1   Medium  Medium  Low
site1   Medium  Low High
site1   Medium  Low Medium
site1   Medium  Low Low
site1   Low High    High
site1   Low High    Medium
site1   Low High    Low
site1   Low Medium  High
site1   Low Medium  Medium
site1   Low Medium  Low
site1   Low Low High
site1   Low Low Medium
site1   Low Low Low
"), header =T)
Run Code Online (Sandbox Code Playgroud)

我想创建一个名为新列new_category基础上cat1,cat2和cat3.

我希望每一行new_category都有公共类"或单词" cat1,cat2和cat3.如果所有值都不同(高,中和低),new_category将采用最高级别(High在这种情况下).

例如

如果cat1 = High,cat2 = High,cat3= Medium,则new_category = High

如果cat1 = High,cat2 = Medium,cat3= Low,则new_category = High

如果cat1 = Medium,cat2 = Medium,cat3= Low,则new_category = Medium

我可以这样做ifelse.但是,cat1和cat2和有很多种组合cat3.

有什么建议可以更快或更简单地做到这一点?

mt1*_*022 5

对于具有周期性水平的行,如果有这样的水平,请选择最常见的水平; 否则选择排名最低的那个;

# convert each row to ordered vector and find the entry with min rank;
df$new_category <- apply(
    df[2:4], 1, function(x){
        f <- table(x)
        if(max(f) > 1){
            names(f)[which.max(f)]
        }else{
            y <- factor(x, levels = c('High', 'Medium', 'Low'), ordered = T)
            as.character(min(y))
        }
    }
)
# > df
#       ID   cat1   cat2   cat3 new_category
# 1  site1   High   High   High         High
# 2  site1   High   High Medium         High
# 3  site1   High   High    Low         High
# 4  site1   High Medium   High         High
# 5  site1   High Medium Medium       Medium
# 6  site1   High Medium    Low         High
# 7  site1   High    Low   High         High
# 8  site1   High    Low Medium         High
# 9  site1   High    Low    Low          Low
# 10 site1 Medium   High   High         High
# 11 site1 Medium   High Medium       Medium
# 12 site1 Medium   High    Low         High
# 13 site1 Medium Medium   High       Medium
# 14 site1 Medium Medium Medium       Medium
# 15 site1 Medium Medium    Low       Medium
# 16 site1 Medium    Low   High         High
# 17 site1 Medium    Low Medium       Medium
# 18 site1 Medium    Low    Low          Low
# 19 site1    Low   High   High         High
# 20 site1    Low   High Medium         High
# 21 site1    Low   High    Low          Low
# 22 site1    Low Medium   High         High
# 23 site1    Low Medium Medium       Medium
# 24 site1    Low Medium    Low          Low
# 25 site1    Low    Low   High          Low
# 26 site1    Low    Low Medium          Low
# 27 site1    Low    Low    Low          Low
Run Code Online (Sandbox Code Playgroud)

  • 我在这里添加它,因为它完全相同的想法 - 不同的功能.为了避免制表和行的`which.max`,另一种方法是在前面制表并使用`max.col`.并且使用`ifelse`,因为我们现在正在处理长度> 1的向量.即`tab = table(row(df [-1]),as.matrix(df [-1])); ifelse(rowSums(tab!= 0)== 3,"High",colnames(tab)[max.col(tab,"first")])` (4认同)