0

各列がアンケート項目を表すワイド形式のアンケート データのデータ フレームがあります。

データは次のようになります。

df <- data.frame(Q1 = c(1, 4, 2, 3, 1, 1, 4, 4, 1, 2), 
             Q2 = c(NA, 3, 1, 4, NA, NA, 3, 4, 1, 2),
             Q3 = c(3, 4, 1, 2, 4, NA, NA, 1, 1, 2),
             Q4 = c(NA, 4, 1, 1, 1, 3, NA, 2, 2, NA))

この関数を使用して、rowSums「4」ではない各行の値を合計し、NA を除外して、結果を非 4 列と非 NA 列の数で除算します (dplyr パイプを使用)。基になるデータ フレームの 4 を置き換えたくありません。そのまま残したい。

結果を非 4 列と非 NA 列の数で割る方法がわからないため、質問の最初の部分だけを試してみました。次のコードを使用して最初の部分を試みましたが、うまくいきませんでした:

library(dplyr)

df <- df %>%
  as.data.frame() %>%
  mutate(sum = rowSums(.[. != 4, ], na.rm = TRUE))

目的の出力は次のようになります。 特定の値を除くrowSums

上のスクリーンショットでは、「平均」列は、非 4 および非 NA 値の合計を非 4 および非 NA 列の数で割ったものです。

ありがとう!

4

3 に答える 3

2

これを厳密に行いたい場合は、withdplyrを使用して、4 以外の値の各行の合計を計算し、それらを値の で割ることができます。rowwisedolength

library(dplyr)
df %>%
  rowwise() %>%
  do( (.) %>% as.data.frame %>% 
  mutate(mean = sum(.[. != 4], na.rm = TRUE)/length(.[.!=4 & !is.na(.)])))


#    Q1    Q2    Q3    Q4   mean
# * <dbl> <dbl> <dbl> <dbl> <dbl>
# 1  1.00 NA     3.00 NA     2.00
# 2  4.00  3.00  4.00  4.00  3.00
# 3  2.00  1.00  1.00  1.00  1.25
# 4  3.00  4.00  2.00  1.00  2.00
# 5  1.00 NA     4.00  1.00  1.00
# 6  1.00 NA    NA     3.00  2.00
# 7  4.00  3.00 NA    NA     3.00
# 8  4.00  4.00  1.00  2.00  1.50
# 9  1.00  1.00  1.00  2.00  1.25
#10  2.00  2.00  2.00 NA     2.00

編集 - 回答を投稿した後、実際に使用できることに気付きましたmean

df %>%
  rowwise() %>%
  do( (.) %>% as.data.frame %>% 
  mutate(mean = mean(.[. != 4], na.rm = TRUE)))
于 2018-07-18T09:01:15.953 に答える