1

これは基本的な質問であり、重複する可能性がありますが、見つけられないようですので、ご容赦ください。適切な場所を教えてください。ありがとう!

可能性のある NA と欠損値を含む整数を含むデータ フレームがあります。行の平均 (NA をゼロに設定) と列の平均 (NA をスキップ) を計算しています。次に、整数と行の平均と列の平均を含むデータ フレーム (またはテーブル) を作成したいと思います。データ フレームの例を次に示します。

df <- data.frame(
  'ID' = c("123A","456B","789C","1011","1213")
  , 'Test 1' = c(55,65,60,NA,50)
  , 'Test 2' = c(45,48,50,52,55)
  , 'Test 3' = c(51,49,55,69,61)
 )
df
    ID Test.1 Test.2 Test.3
1 123A     55     45     51
2 456B     65     48     49
3 789C     60     50     55
4 1011     NA     52     69
5 1213     50     55     61

NA をスキップして列の平均値を計算する関数は次のとおりです。

colMean <- function(df, na.rm = TRUE) {
  if (na.rm) {
    n <- rowSums(!is.na(df))
  } else {
    n <- ncol(df)
  }
  colMean <- colMeans(df, na.rm=na.rm)
  return(rbind(df, "colMean" = colMean))
}

以下は、行平均を計算して NA をゼロに設定する関数です。

rowMeanz <- function(df) {
  df[is.na(df)] <- 0
  return(cbind(df, "rowMean" = rowMeans(df)))
}

問題の 1 つは、rbind がデータ型を変更することです。つまり、"Test.1" というラベルの付いた列で整数が浮動小数点数に変換される (または浮動小数点数のように見える) という意味です。

colMean(df[sapply(df, is.numeric)])
        Test.1 Test.2 Test.3
1         55.0     45     51
2         65.0     48     49
3         60.0     50     55
4           NA     52     69
5         50.0     55     61
colMean   57.5     50     57

あなたの答えでは、この場合に最初の列だけが影響を受けているように見える理由の説明に非常に感謝しています. 列内の NA の存在に関連していますか?

私は cbind に基づいて、他の関数で同じ問題を観察していません:

rowMeanz(df[sapply(df, is.numeric)])
  Test.1 Test.2 Test.3  rowMean
1     55     45     51 50.33333
2     65     48     49 54.00000
3     60     50     55 55.00000
4      0     52     69 40.33333
5     50     55     61 55.33333

最終的には、次のようなデータフレームまたはテーブルを取得したいと思います。

    ID Test.1 Test.2 Test.3  rowMean
1 123A     55     45     51 50.33333
2 456B     65     48     49 54.00000
3 789C     60     50     55 55.00000
4 1011     NA     52     69 40.33333
5 1213     50     55     61 55.33333
6 colMean  57.5   50     57 

あまり多くの手順でこれを行う方法を教えていただければ幸いです。私は基本的な R の回答だけでなく、パッケージに基づく回答にもオープンです。これらの計算は、光沢のあるアプリ内でオンラインで行われるため、特に効率的な方法を確認したいと考えています. どうもありがとう!

4

3 に答える 3