заменяя все NA на 0 в data.table в R - PullRequest
2 голосов
/ 26 мая 2020

У меня data.table со многими столбцами. Есть 4 столбца, в которых я хочу заменить NA на 0.

У меня есть рабочее решение:

  claimsMonthly[is.na(claim9month),claim9month := 0
          ][is.na(claim10month),claim10month := 0
            ][is.na(claim11month),claim11month := 0
              ][is.na(claim12month),claim12month := 0]

Однако это довольно часто повторяется, и я хотел уменьшить это на используя l oop (не уверен, что это самая умная идея?):

  for (i in 9:12){
    claimsMonthly[is.na(paste0("claim", i, "month")), paste0("claim", i, "month") := 0]
  }

Когда я запускаю этот l oop, ничего не происходит. Я предполагаю, что это связано с пактом, что paste0() возвращает "claim12month", поэтому я получаю in.na("claim12month"). Результат - FALSE, несмотря на то, что в моих данных есть NA. Полагаю, это как-то связано с кавычками?

Это не первый раз, когда у меня возникают проблемы с использованием paste0() или запуском циклов с data.table, поэтому я, должно быть, упускаю что-то важное.

Есть идеи, как это исправить?

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Мы можем указать .SDcols с именами столбцов ('nm1'), l oop вместо .SD (Subset of Data.table) и присвоить NA значение 0 (replace_na из tidyr)

library(data.table)
library(tidyr)
nm1 <- paste0("claim", 9:12, "month")
setDT(claimsMonthly)[, (nm1) := lapply(.SD, replace_na, 0), .SDcols = nm1]

Или, как @jangorecki упомянул в комментариях, nafill from data.table было бы лучше

setDT(claimsMonthly)[, (nm1) := lapply(.SD, nafill, fill = 0), .SDcols = nm1]

или используя al oop с set, назначьте интересующие столбцы с 0 на основе значений NA в каждом столбце, указав i (для индекса строки) и j для индекса / имени столбца

for(j in nm1){
    set(claimsMonthly, i = which(is.na(claimsMonthly[[j]])), j =j, value = 0)
 }

Или с setnafill

setnafill(claimsMonthly, cols = nm1, fill = 0)
0 голосов
/ 26 мая 2020

Вы можете использовать:

claimsMonthly[, 9:12][is.na(claimsMonthly[, 9:12])] <- 0

Также вы можете использовать имена переменных:

claimsMonthly[c("claim9month", "claim10month","claim11month","claim12month")][is.na(claimsMonthly[c("claim9month", "claim10month","claim11month","claim12month")])] <- 0

Или, что еще лучше, вы можете использовать вектор со всеми переменными с шаблоном «claimXXmonth».

...