使用此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.
有什么建议可以更快或更简单地做到这一点?
对于具有周期性水平的行,如果有这样的水平,请选择最常见的水平; 否则选择排名最低的那个;
# 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)