2017-08-19 4 views
0

"tidyverse"パッケージを使用してデータを整理しようとしています。データを収集したときの日付(2000年、2005年、2010年)とその行の国の得点を使って、各国の「ジェンダー不平等」インデックススコアを含むデータフレームがあります。ベクトルが1より大きい "if else"文を作成する

私はこれらのスコアを追加しないと3によってそれらを分割し、2、または年のいずれかのスコアが0であるかどうかに応じて、何もする必要があります - 私は

Year  2000 2005 2010 
Norway 0  0.106 0.080 

を持っている場合、例えばので、私がしたいです(0 + 0.106 + 0.080)を3つ追加し、2で割る。すべての国でスコアがある場合は3で割る、1年しかスコアがある場合は0で割る

これを行うにはelse文の場合は次のようになります。

GII_data_FINAL <- if (GII_data2$`2000` == 0 & GII_data2$`2005` != 0 & GII_data2$`2010` != 0){GII_data2 %>% 
    mutate(GII_mean_score = (`2000`+ `2005`+ `2010`)/2) 
} else if (GII_data2$`2000`= 0 & GII_data2$`2005` == 0 & GII_data2$`2010` != 0) {GII_data2 %>% 
    mutate(GII_mean_score = `2000`+ `2005`+ `2010`) 
} else if (GII_data2$`2000`== 0 & GII_data2$`2005` != 0 & GII_data2$`2010` == 0) {GII_data2 %>% 
    mutate(GII_mean_score = `2000`+ `2005`+ `2010`) 
} else if (GII_data2$`2000`!= 0 & GII_data2$`2005`!= 0 & GII_data2$`2010` != 0) {GII_data2 %>% 
    mutate (GII_mean_score = (`2000`+ `2005`+ `2010`)/3) 
} else if (GII_data$`2000`!= 0 & GII_data$`2005` == 0 & GII_data$`2010` != 0) {GII_data2 %>% 
    mutate(GII_mean_score = (`2000`+ `2005`+ `2010`)/2) 
} else if (GII_data$`2000`!= 0 & GII_data$`2005` == 0 & GII_data$`2010` == 0) { GII_data2 %>% 
    mutate(GII_mean_score = `2000`+ `2005`+ `2010`) 
} else if (GII_data$`2000`!= 0 & GII_data$`2005` != 0 & GII_data$`2010` == 0) {GII_data2 %>% 
    mutate(GII_mean_score = (`2000`+ `2005`+ `2010`)/2) 
} else if (GII_data2$`2000` == 0 & GII_data2$`2005` == 0 & GII_data2$`2010` == 0) {GII_data2 %>% 
    mutate(GII_mean_score = `2000`+ `2005`+ `2010`) 
} 

、私は声明

"Warning messages: 
1: In if (GII_data2$`2000` == 0 & GII_data2$`2005` != 0 & GII_data2$`2010` != : 
    the condition has length > 1 and only the first element will be used 
2: In if (GII_data2$`2000` & GII_data2$`2005` == 0 & GII_data2$`2010` != : 
    the condition has length > 1 and only the first element will be used 
3: In if (GII_data2$`2000` == 0 & GII_data2$`2005` != 0 & GII_data2$`2010` == : 
    the condition has length > 1 and only the first element will be used 
4: In if (GII_data2$`2000` != 0 & GII_data2$`2005` != 0 & GII_data2$`2010` != : 
    the condition has length > 1 and only the first element will be used" 

を取得しかし、私が調査していると私はこの文を取得する理由を私は理解し、私はRが、私はそれがやりたいことを得るためにどのように他わからないにifelseは(私が理解する限り)いくつかの条件を持つことで動作しないためです。

私はどんな助けもありがとう!

+2

'0'を' NA'に置き換え、 'rowMeans(d [、-1]、na.rm = TRUE)'を使用します。 – Henrik

答えて

0

複数行(あなたのケースで

場合

付き)、一般的に関数を記述するためのヒントです。実際には、平均を計算したいが、ゼロは除外したい。あなたは定義することができます。

average_exclude_0 =機能(X){平均(X [X = 0!])}

を次にあなたが列を対応するには、この機能を適用することができ、例えばmutate_atとなります。

EDIT:コメントを追加することはできませんが、私はヘンリクの提案が最善のアプローチであると思うだろう:それは速いと方法論正しいか、ゼロが実際のNA

0

Rの愛好家がそれを嫌うことに気づいているので、なぜ行をループしないのですか?

for (row in 1:nrow(your_dataframe)) { 
    n_entries = 0 
    sum = 0 
    for (col in 1:ncol(your_dataframe) { 
     if (your_dataframe[row,col] != 0) { 
      n_entries = n_entries + 1 
      sum = sum + your_dataframe[row,col] 
     } 
    } 
    result = NULL 
    if (n_entries > 0) { result = sum/n_entries } 
    else { 
     result = NA 
    } 
    # Do something with the result 
} 

これを関数にラップし、理想的には私が推測する適用機能を使用する必要があります。私の解決策は、他の言語でもこれを行う方法のより一般的な考えを与えるかもしれません。

+0

最後に上記のコメントはより速い解決策でしたが、これをありがとう、それは私にRの新しい機能を教えてくれました! –

0

ているので、私はゼロを除いた平均値を計算する関数を記述することをお勧め:

mean_excluding_0 =関数(X){平均値(X [X!= 0])}

次に、correspするために、この機能を適用するmutate_atを使用することができ列上にあります。