Создайте суммирующую переменную для нескольких столбцов в data.table r - PullRequest
2 голосов
/ 07 августа 2020

У меня есть следующие data.table

dt <- data.table(id=c(1,2,2,2,3,3,4),
                 date=c("2019-09-13", "2018-12-06", "2017-12-14", "2018-02-08", "2015-12-06", "2012-12-14", "2011-02-08"),
                 variable_1=c("a","b",NA,NA,"b","c",NA),
                 variable_2=c(NA,NA,"a",NA,"a","c",NA),
                 variable_3=c(NA,NA,NA,"b","c","c",NA))
dt
id       date variable_1 variable_2 variable_3
1:  1 2019-09-13          a       <NA>       <NA>
2:  2 2018-12-06          b       <NA>       <NA>
3:  2 2017-12-14       <NA>          a       <NA>
4:  2 2018-02-08       <NA>       <NA>          b
5:  3 2015-12-06          b          a          c
6:  3 2012-12-14          c          c          c
7:  4 2011-02-08       <NA>       <NA>       <NA>

Я хочу создать переменную y, которая суммирует все столбцы. Все, что имеет один !is.na() среди переменных, должно быть 0. Каждая строка, которая имеет только is.na среди всех переменных, должна быть 1. Примерно так:

   id       date variable_1 variable_2 variable_3 y
1:  1 2019-09-13          a       <NA>       <NA> 0
2:  2 2018-12-06          b       <NA>       <NA> 0
3:  2 2017-12-14       <NA>          a       <NA> 0
4:  2 2018-02-08       <NA>       <NA>          b 0
5:  3 2015-12-06          b          a          c 0
6:  3 2012-12-14          c          c          c 0
7:  4 2011-02-08       <NA>       <NA>       <NA> 1

В исходном data.table у меня есть 22 переменные, которые я ищу среди 830 переменных. Поэтому я бы предпочел не искать каждую переменную с _1 до _22 отдельно. Есть ли способ в data.table?

1 Ответ

3 голосов
/ 07 августа 2020
dt[, y := +(rowSums(!is.na(.SD)) == 0L), .SDcols = patterns("^variable_")]
#    id       date variable_1 variable_2 variable_3 y
# 1:  1 2019-09-13          a       <NA>       <NA> 0
# 2:  2 2018-12-06          b       <NA>       <NA> 0
# 3:  2 2017-12-14       <NA>          a       <NA> 0
# 4:  2 2018-02-08       <NA>       <NA>          b 0
# 5:  3 2015-12-06          b          a          c 0
# 6:  3 2012-12-14          c          c          c 0
# 7:  4 2011-02-08       <NA>       <NA>       <NA> 1

Поход:

  • .SDcols=patterns(...) определяет столбцы, которые будут обрабатываться как .SD в компоненте j. Это не требует удаления / выбора столбцов для вывода, только тех, на которые будут ссылаться внутренние.
  • !is.na(.SD) возвращает logical matrix, те же тусклые, что и .SD, указывая, является ли его значение NA.
  • rowSums(...) возвращает количество не- NA s в строке.
  • с использованием инвертированного logi c of «подсчитать количество не - NA значений в строке», мы можем не заботиться о количестве обрабатываемых столбцов; это то, что позволяет мне использовать == 0L.
  • +(...) - это сокращенный трюк для преобразования logical в 0:1
...