2016-11-26 5 views
2

に3つのカテゴリを組み合わせる:Ifelse:このdata.frameを使用して1

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) 

私はcat1cat2cat3に基づいてnew_categoryと呼ばれる新しい列を作成します。

new_categoryの各行にcat1cat2cat3という共通クラス "or"を使用したいとします。すべての値が異なる場合(高、中、低)、new_categoryは最高クラス(この場合はHigh)になります。例えば

次いで

cat1 = High場合、cat2 = Highcat3= Medium、次いでnew_category = High

cat1 = High場合、cat2 = Mediumcat3= Low、次いでnew_category = High

cat1 = Medium場合、cat2 = Mediumcat3= Lownew_category = Medium

ifelseを使用してこれを行うことができます。しかし、cat1cat2cat3の組み合わせが多数あります。

これを行うためのより簡単なやり方はありますか?

答えて

5

再帰レベルの行の場合は、そのようなレベルがある場合は最も頻繁に1を選択します。そうでない場合は、ランクが最も低いものを選択します。

# 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 
+0

完璧:-)あなたの時間と助けをたくさんありがとう – aelwan

+1

あなたは大歓迎です。また、「最小」と「最大」は通常の要素に適用できないが、順序付けされた要素に適用できることも知った。 :) – mt1022

+4

私はここにそれを追加します、それはまったく同じアイデアです - 異なる機能。テーブル化と行による 'which.max'を避けるために、代わりに、表を表にして' max.col'を使用する方法があります。そして、長さ> 1のベクトルで作業しているので、 'ifelse'を使用してください。私。 'tab = table(行(df [-1])、as.matrix(df [-1])); ifelse(rowSums(tab!= 0)== 3、 "High"、colnames(tab)[max.col(tab、 "first")]) ' –

関連する問題