заменить значения строки на основе другого значения строки в data.table - PullRequest
0 голосов
/ 19 марта 2020

У меня тривиальный вопрос, хотя я изо всех сил пытаюсь найти простой ответ. У меня есть таблица данных, которая выглядит примерно так:

dt <- data.table(id= c(A,A,A,A,B,B,B,C,C,C), time=c(1,2,3,1,2,3,1,2,3), score = c(10,15,13,25,NA,NA,18,29,19))
dt
#     id  time  score
# 1:   A    1    NA
# 2:   A    2    10
# 3:   A    3    15
# 4:   A    4    13
# 5:   B    1    NA
# 6:   B    2    25
# 7:   B    3    NA
# 8:   B    4    NA
# 9:   C    1    18
# 10:  C    2    29
# 11:  C    3    NA
# 12:  C    4    19

Я хотел бы заменить отсутствующие значения моей группы "B" на значения "A".

Окончательный набор данных должен выглядеть примерно так:

final
#     id  time  score
# 1:   A    1    NA
# 2:   A    2    10
# 3:   A    3    15
# 4:   A    4    13
# 5:   B    1    NA
# 6:   B    2    25
# 7:   B    3    15
# 8:   B    4    13
# 9:   C    1    18
# 10:  C    2    29
# 11:  C    3    NA
# 12:  C    4    19

Другими словами, при условии, что B - это NA, я хотел бы заменить оценку «A». Обратите внимание, что «C» остается NA. Я изо всех сил пытаюсь найти чистый способ сделать это, используя data.table. Однако, если это проще с другими методами, все равно будет хорошо.

Большое спасибо за вашу помощь

1 Ответ

1 голос
/ 19 марта 2020

Вот один вариант, в котором мы получаем индекс строк, которые NA для «счета», а «id» - «B», используйте его, чтобы заменить NA соответствующим значением «Score» из «A». '

library(data.table)
i1 <- setDT(dt)[id == 'B', which(is.na(score))]
dt[, score:= replace(score, id == 'B' & is.na(score), score[which(id == 'A')[i1]])]

или аналогичный параметр в dplyr

library(dplyr)
dt %>%
   mutate(score = replace(score, id == "B" & is.na(score), 
         score[which(id == "A")[i1]))
...