Замена отсутствующих значений в данных временных рядов в R - PullRequest
0 голосов
/ 15 марта 2019

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

SubID: номер субъекта

День: номер дня каждого субъекта (1,2,3 ... 21)

Время: утро, помеченное как 1, день, отмеченный как 2, и вечер, отмеченный как 3

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

SubID 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

Мне удалось пройти до следующих кодов в зоопарке.У меня очень ограниченный опыт в R. Спасибо заранее!

data2 <- transform(data1, x = na.aggregate(x,by=SubID,FUN=sum,na.rm = T))

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вот объяснение моего комментария:

library(data.table)
library(zoo)
setDT(data1)
data1[order(-Time),
      Xf := na.locf(X),
      by = .(SubID, Day)]

Хорошо, поэтому функция setDT делает объект data1 data.table.Затем order(-Time) заказывает data1 относительно Time в порядке убывания (из-за -).Xf := na.locf(X) создает новый столбец Xf по ссылке (что означает, что вам не нужно присваивать его обратно data1) как na.locf(X), который является функцией в пакете zoo, который заполняет NA вперед с помощьюпредыдущее значение (в этом случае заполнение 2 и 1 значением 3).Последняя строка указывает, что мы хотим сделать это сгруппированными по SubID и Day.

Надеюсь, теперь все стало понятнее, не стесняйтесь спрашивать, есть ли у вас дальнейшие сомнения.

1 голос
/ 15 марта 2019

Вы можете отсортировать данные по убыванию времени, а затем использовать X[1].

library(dplyr)

df <- tibble(SubID=1, Day=1, Time=c(1,2,3), X=c(NA, NA, 2.2))

df <- df %>%
    group_by(SubID, Day) %>%
    arrange(desc(Time)) %>%
    mutate(
        X=case_when(
            is.na(X) ~ X[1],
            TRUE ~ X)
    )
...