Сумма NA по определенным столбцам в R

У меня есть такие данные:

  data_in <- read_table2("Id    Q62_1   Q62_2   Q3_1    Q3_2    Q3_3    Q3_4    Q3_5
1   Yes Sometimes                   
2       Always                  
3                           
4   No  Always  Yes             
5                           
6       Always  No  Likely  Yes Always  Always
7   Yes Sometimes   Maybe   Unlikely        Sometimes   Sometimes
8       Always  Yes Likely  No  Always  Always
9       Sometimes       Unlikely        Sometimes   Sometimes
10  No      No  Likely  Maybe       
11      Sometimes   Maybe   Unlikely        Sometimes   Sometimes
12      Always  Yes Likely      Always  Always
")

Я хотел бы рассчитать количество отсутствующих ответов в столбцах, которые начинаются с Q62, а затем отдельно от столбцов Q3_1 по Q3_5.

Я знаю, что rowSums удобен для суммирования числовых переменных, но есть ли эквивалент dplyr / piped для суммы na?

Например, если бы это были числовые данные, и я хотел бы суммировать ряд q62, я мог бы использовать следующее:

data_in %>% 
  mutate(Q62_NA = rowSums(select(.,"Q62_1", "Q62_2"))

Но как мне суммировать НП?

Мой результат должен выглядеть примерно так:

data_out <- read_table2("Id Q62_1   Q62_2   Q3_1    Q3_2    Q3_3    Q3_4    Q3_5    Q62_NA  Q3_NA
1   Yes Sometimes                       0   5
2       Always                      1   5
3                               2   5
4   No  Always  Yes                 0   5
5                               2   5
6       Always  No  Likely  Yes Always  Always  1   
7   Yes Sometimes   Maybe   Unlikely        Sometimes   Sometimes   0   1
8       Always  Yes Likely  No  Always  Always  1   0
9       Sometimes       Unlikely        Sometimes   Sometimes   1   1
10  No      No  Likely  Maybe           1   2
11      Sometimes   Maybe   Unlikely        Sometimes   Sometimes   1   1
12      Always  Yes Likely      Always  Always  1   1
")

Спасибо!!


person NewBee    schedule 24.09.2020    source источник


Ответы (2)


Мы можем обернуть select is.na, чтобы преобразовать его в логический matrix, а затем выполнить rowSums на этой матрице, чтобы суммировать количество ИСТИННЫХ элементов в строке

library(dplyr)
data_in %>% 
   mutate(Q62_NA = rowSums(is.na(select(.,"Q62_1", "Q62_2"))))

Или вариант с c_across и rowwise

 data_in %>%
    rowwise %>%
    mutate(Q62_NA = sum(is.na(c_across(starts_with('Q6')))))
person akrun    schedule 24.09.2020
comment
есть ли способ добавить несколько совпадений в эту команду? что-то вроде data_in% ›% mutate (Q62_NA = rowSums (is.na (select (., matches (Q62 | Q3)))))‹ - это не работает - person NewBee; 25.09.2020
comment
@NewBee Цитаты должны быть matches("^(Q62|Q3)") - person akrun; 25.09.2020
comment
небольшая проблема .. Я хочу взять только те, которые начинаются с Q62 (Q62_1 в порядке), а не Q621, есть ли способ сделать это? Я бы в идеале использовал начинается с, но он допускает только одну переменную ... - person NewBee; 25.09.2020
comment
@NewBee В таком случае matches("^Q62\\D+") - person akrun; 25.09.2020
comment
@NewBee Я думаю, это должно сработать data_in %>% rename(Q625 = Q3_1, Q62 = Q3_2) %>% select(matches('^Q62(\\D+|$)')) он также вернет такие имена, как 'Q62', 'Q62_1', 'Q62_2', но не 'Q625' - person akrun; 25.09.2020

Вот базовый вариант R

transform(
  data_in,
  Q62_NA = rowSums(is.na(data_in[grepl("Q62",names(data_in))])),
  Q3_NA = rowSums(is.na(data_in[grepl("Q3",names(data_in))]))
)

который дает

   Id     Q62_1     Q62_2      Q3_1      Q3_2      Q3_3      Q3_4 Q3_5 Q62_NA
1   1       Yes Sometimes      <NA>      <NA>      <NA>      <NA> <NA>      0
2   2    Always      <NA>      <NA>      <NA>      <NA>      <NA> <NA>      1
3   3      <NA>      <NA>      <NA>      <NA>      <NA>      <NA> <NA>      2
4   4        No    Always       Yes      <NA>      <NA>      <NA> <NA>      0
5   5      <NA>      <NA>      <NA>      <NA>      <NA>      <NA> <NA>      2
6   6    Always        No    Likely       Yes    Always    Always <NA>      0
7   7       Yes Sometimes     Maybe  Unlikely Sometimes Sometimes <NA>      0
8   8    Always       Yes    Likely        No    Always    Always <NA>      0
9   9 Sometimes  Unlikely Sometimes Sometimes      <NA>      <NA> <NA>      0
10 10        No        No    Likely     Maybe      <NA>      <NA> <NA>      0
11 11 Sometimes     Maybe  Unlikely Sometimes Sometimes      <NA> <NA>      0
12 12    Always       Yes    Likely    Always    Always      <NA> <NA>      0
   Q3_NA
1      5
2      5
3      5
4      4
5      5
6      1
7      1
8      1
9      3
10     3
11     2
12     2
person ThomasIsCoding    schedule 24.09.2020