R заменяет отсутствующие значения на na.locf - PullRequest
1 голос
/ 27 апреля 2020

Я новичок в R. Я надеялся заменить отсутствующие значения X в данных. Как я могу заменить отсутствующие значения «X», когда «Time» = 1 и 2, значением «X», когда «Time» = 3 для того же «ID» и того же «Day»

X: имеет допустимое значение только когда время равно 3, другие отсутствуют.

 ID   Day  Time   X    
 1    1     1     NA
 1    1     2     NA
 1    1     3     7.4
 1    2     1     NA
 1    2     3     6.2
 2    1     1     NA
 2    1     2     NA
 2    1     3     7.1
 2    2     3     5.9
 2    2     2     NA
 2    2     1     NA

Я смог написать и запустить следующие коды с пакетом zoo и data.table, но потом, когда я проверил данные, это не сработало - значение X по-прежнему содержит все пропущенные значения, когда время = 1 и 2. Что-то не так с моим кодом? Какие-либо предложения? У меня очень ограниченный опыт в R. Спасибо заранее!

setDT(data1) data1 <- data1 [order(-Time), X := na.locf(X), by = .(ID, Day)]

Ответы [ 3 ]

2 голосов
/ 27 апреля 2020

Вот 2 варианта:

1) Использование скользящего соединения в data.table:

DT[, X1 :=
    DT[!is.na(X)][.SD, on=.(ID, Day, Time), roll=-Inf, x.X]
]

2) использование data.table::nafill с "locf" по идентификатору и Day после сортировки по ID, день и время убывания:

DT[order(ID, Day, -Time), X2 := nafill(X, "locf"), .(ID, Day)]

вывод:

    ID Day Time   X  X1  X2
 1:  1   1    1  NA 7.4 7.4
 2:  1   1    2  NA 7.4 7.4
 3:  1   1    3 7.4 7.4 7.4
 4:  1   2    1  NA 6.2 6.2
 5:  1   2    3 6.2 6.2 6.2
 6:  2   1    1  NA 7.1 7.1
 7:  2   1    2  NA 7.1 7.1
 8:  2   1    3 7.1 7.1 7.1
 9:  2   2    3 5.9 5.9 5.9
10:  2   2    2  NA 5.9 5.9
11:  2   2    1  NA 5.9 5.9
12:  2   3    1  NA  NA  NA
13:  2   3    2  NA  NA  NA
14:  2   3    3  NA  NA  NA

данные:

library(data.table)
DT <- fread("ID   Day  Time   X    
1    1     1     NA
1    1     2     NA
1    1     3     7.4
1    2     1     NA
1    2     3     6.2
2    1     1     NA
2    1     2     NA
2    1     3     7.1
2    2     3     5.9
2    2     2     NA
2    2     1     NA
2 3 1 NA
2 3 2 NA
2 3 3 NA")
1 голос
/ 27 апреля 2020

В примере в вопросе каждая группа имеет не более одного не пропущенного значения, и в каждом случае это значение должно быть присвоено каждому значению в этой группе, поэтому, если это общий случай, правило сводится к назначению одного не -НА значение для всех значений Х в группе:

data1[, X := na.omit(X), .(ID, Day)]
1 голос
/ 27 апреля 2020

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

setDT(data1)
data1[, X := replace(X, is.na(X), X[Time == 3]), .(ID, Day)]

#    ID Day Time   X
# 1:  1   1    1 7.4
# 2:  1   1    2 7.4
# 3:  1   1    3 7.4
# 4:  1   2    1 6.2
# 5:  1   2    3 6.2
# 6:  2   1    1 7.1
# 7:  2   1    2 7.1
# 8:  2   1    3 7.1
# 9:  2   2    3 5.9
#10:  2   2    2 5.9
#11:  2   2    1 5.9

Аналогично, используя dplyr.

library(dplyr)
data1 %>% group_by(ID, Day) %>% mutate(X =replace(X, is.na(X), X[Time == 3]))

Если у вас более 1 значения в группе, где Time == 3 используется which.max

data1[, X := replace(X, is.na(X), X[which.max(Time == 3)]), .(ID, Day)]

Если для Time == 3 нет значения, мы можем использовать:

data1[, X := if(any(Time == 3)) replace(X, is.na(X), X[which.max(Time == 3)]), .(ID, Day)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...