нужна помощь в создании функции для удаления одной волны данных, если она является дубликатом предыдущей волны для ретроспективного измерения - PullRequest
1 голос
/ 25 января 2020

Я работаю с продольным набором данных, который имеет ретроспективный показатель травмы, который дает одобрение вопроса «да / нет» и возраст начала, если ответ был «да». Если вопрос был подтвержден на первой волне данных, а затем снова на второй волне с тем же возрастом, его необходимо преобразовать в «нет», а в возраст - в «NA». Мои данные выглядят так:

df <- as.data.frame(cbind(Aw1 = c(0,0,1,0,0),
                          Aagew1 = c(NA,NA,23,NA,NA),
                          Aw2 = c(1,0,1,0,0),
                          Aagew2 = c(29,NA,23,NA,NA),
                          Bw1 = c(1,0,0,0,1),
                          Bagew1 = c(20,NA,NA,NA,23),
                          Bw2 = c(1,0,1,0,1),
                          Bagew2 = c(20,NA,28,NA,23)))
print(df)
  Aw1 Aagew1 Aw2 Aagew2 Bw1 Bagew1 Bw2 Bagew2
1   0     NA   1     29   1     20   1     20
2   0     NA   0     NA   0     NA   0     NA
3   1     23   1     23   0     NA   1     28
4   0     NA   0     NA   0     NA   0     NA
5   0     NA   0     NA   1     23   1     23

Используя следующий синтаксис data.table, я могу условно перекодировать то, что я хочу, чтобы вопрос «A» на волне два, то есть тот же инцидент, записанный в волна 1, больше не присутствует

dt <- as.data.table(df)
dt[Aagew1 == Aagew2, ':=' (Aw2 = 0, Aagew2 = NA)]
print(dt)
   Aw1 Aagew1 Aw2 Aagew2 Bw1 Bagew1 Bw2 Bagew2
1:   0     NA   1     29   1     20   1     20
2:   0     NA   0     NA   0     NA   0     NA
3:   1     23   0     NA   0     NA   1     28
4:   0     NA   0     NA   0     NA   0     NA
5:   0     NA   0     NA   1     23   1     23

Я хотел бы автоматизировать этот синтаксис и поместить его в функцию, чтобы каждый вопрос, который повторяется на волне 2, был удален. Вот функция, которую я сделал, которая не работает:

rm.duplicate <- function(x){
  y <- as.data.table(x)
  for(i in LETTERS[1:2]){
    y[paste0(i,"age","w1") == paste0(i,"age","w2"), ':=' (paste0(i,"w2") = 0, paste0(i,"age","w2") = NA)]
  }
  return(as.data.frame(y))
}

Желаемый результат (так что дубликаты на волне 2 удаляются для всех уникальных вопросов):

Aw1 Aagew1 Aw2 Aagew2 Bw1 Bagew1 Bw2 Bagew2
1:   0     NA   1     29   1     20   0     NA
2:   0     NA   0     NA   0     NA   0     NA
3:   1     23   0     NA   0     NA   1     28
4:   0     NA   0     NA   0     NA   0     NA
5:   0     NA   0     NA   1     23   0     NA

Спасибо за помощь!

1 Ответ

1 голос
/ 26 января 2020

Функцию OP можно слегка изменить, добавив get для возврата значения

rm.duplicate <- function(x){
  y <- as.data.table(x)
  for(i in LETTERS[1:2]){
      y[get(paste0(i,"age","w1")) == get(paste0(i,"age","w2")), 
           paste0(i,c("", "age"), "w2")  := .(0,  NA)]
    }
   return(as.data.frame(y))
 }

rm.duplicate(df)
#  Aw1 Aagew1 Aw2 Aagew2 Bw1 Bagew1 Bw2 Bagew2
#1   0     NA   1     29   1     20   0     NA
#2   0     NA   0     NA   0     NA   0     NA
#3   1     23   0     NA   0     NA   1     28
#4   0     NA   0     NA   0     NA   0     NA
#5   0     NA   0     NA   1     23   0     NA

Или другой вариант set

dt <- as.data.table(df)
 for(i in LETTERS[1:2]){
   w1 <- paste0(i,"age","w1")
   w2 <- paste0(i,"age","w2")
   i1 <- which(dt[[w1]] == dt[[w2]])
   nm1 <- paste0(i,c("", "age"), "w2")
   set(dt, i = i1, j = nm1[1], value = 0)
   set(dt, i = i1, j = nm1[2], value = NA)

 }

dt
...