トップ 一覧 検索 ヘルプ RSS ログイン 印刷

行の合計の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
! データ行の合計を計算する

Rはベクトル単位の計算はとても便利な関数が揃っているが、行単位で演算しようとすると途端に面倒になる。

会計でよく使う、縦計・横計でも同様で、縦計はいろいろできるが横計は辛い。

データ

 df_sample <- tibble(
    ID = c("a", "b", "c", "d", "e", "f"),
    A1 = c(1, NA, NA, NA, NA, NA),
    A2 = c(NA, 1, NA, NA, NA, NA),
    A3 = c(NA, NA, 1, NA, NA, NA),
    B1 = c(NA, NA, NA, 1, NA, NA),
    B2 = c(NA, NA, NA, NA, 1, NA),
    B3 = c(NA, NA, NA, NA, NA, 1)
    )

! rowSums()は行列が対象
! rowSums()は数値型が対象なので項目を選択する

 rowSums (x, na.rm = FALSE, dims = 1)

この場合、xは行列でなければ機能しない。つまりtibbleでは動作しない。

 df_sample %>% select(-ID) %>% #文字型の項目を除く
     mutate(Sum = rowSums(., na.rm = T)) #NAを外す

として、数値のみを対象とする。
! 原理的な方法(各列を足す)

 > df_sample %>% 
    replace_na(replace = list(A1 = 0, A2 = 0, A3 = 0, B1 = 0, B2 = 0, B3 = 0)) %>% 
    mutate(score = sum(A1:B3))

! 行列への関数を一括適用する方法

 df %>% select_if(is.numeric) %>%
    apply(1, sum, na.rm = TRUE)


! とりあえず見出している方法



処理

 df_sample %>% nest(-ID) %>%  # ID以外をまとめて一つのデータの塊dataとする
     mutate(score = map(data, sum, na.rm=T)) %>%  #dataに合計sumを適用(NAを除く)してscoreに代入する
     unnest()  # まとめたdataを復元する