[R] Checking specific pair of codes within subject

Frank S. f_j_rod at hotmail.com
Wed Nov 23 14:36:13 CET 2016


Dear all,
I come with an old question I had, which I have also solved but the last point. I've a data.table as follows:

dt <- data.table(id = rep(1:2, c(5, 2)),
     date = as.Date(rep(c("2005-07-25", "2006-09-17", "2001-10-19"), c(3, 2, 2))),
      sex = as.factor( rep(c(0, 1), c(5, 2))),
      hosp = as.factor(c('A11', 'C11', 'R1000', 'W1000', 'C11', 'B22', 'D22')),
      check = as.factor(rep(c(T, F, T), c(3, 2, 2))))

By avoiding splitting data table, I would like to do: If check = T, keep all rows by unique pairs (id, date) excepting those
where hosp %in% c("C11", "D22"). If check = F, keep all rows but changing "C11" to "A11". So desired otput is:

    id             date  sex  hosp
1:  1 2005-07-25   0   A11
2:  1 2005-07-25   0 R1000
3:  1 2006-09-17   0 W1000
4:  1 2006-09-17   0   A11
5:  2 2001-10-19   1   B22


I've tried (without result):

dtnew <- dt[, {
  if (check == TRUE) {
     idx <-  which(!hosp %in% c("C11", "D22"))
     res <- list(hosp = hosp[idx], sex = sex[idx], check = check[idx])
  } else {
     if (levels(hosp) == "C11"){
         idx <- which(id)
         res <- list(hosp = "A22", sex = sex[idx], check = check[idx])
     } else {
         idx <- which(id)
         res <- list(hosp = hosp[idx], sex = sex[idx], check = check[idx])
     }
  }
  res
}, by = list(id, date)]

I'm aware it may not be the most efficient way. Thanks for any help!!


Frank S.

	[[alternative HTML version deleted]]



More information about the R-help mailing list