Справка по реструктуризации данных: как определить максимальное количество дней между «событиями» и скопировать это значение - PullRequest
0 голосов
/ 25 июня 2018

Я не могу найти ветку, которая отвечает на этот конкретный вопрос, поэтому помощь будет принята.У меня есть набор данных, который выглядит следующим образом: переменная EventCount подсчитывает количество дней между событиями, происходящими для каждого человека в наборе данных (если EventCount = 0, то событие произошло).

Day = c(1:8,1:8)
EventCount = c(NA,NA,0,1,2,0,1,0,0,1,2,3,0,1,2,0)
Person = c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)
dat <- data.frame(Person,Day,EventCount);dat

Я пытаюсь реструктурировать набор данных таким образом, чтобы он принимал максимальное значение МЕЖДУ событиями, происходящими для каждого человека, и копировал или заполнял это значение.Я хочу, чтобы это выглядело так:

NewEvent = c(NA,NA,0,2,2,0,1,0,0,3,3,3,0,2,2,0)
dat2 <- dat <- data.frame(Person,Day,NewEvent);dat2

Заранее спасибо!

1 Ответ

0 голосов
/ 25 июня 2018

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

fillDays <- function(df){
    df$NewEvent <- df$EventCount

    max <- 0
    updateFrom <- 1
    for (i in 1:nrow(df)) {

        if(i %% 8 == 1){ # for each person
            max <- 0
        }
        val <- dat$EventCount[i]

        if(is.na(val)){ # If NA, no updates, just start from next record
            updateFrom =  updateFrom + 1 

        } else if(val == 0) { # If 0, set max to previous records

            if(updateFrom != i){
                df[updateFrom : (i-1), 'NewEvent'] <- max
            }
            max <- 0
            updateFrom = i + 1                

        } else { # update the max 
            if(val > max){
                max <- val
            }
        }
    }

    return(df)
}

> fillDays(dat)

#    Person Day EventCount NewEvent
# 1       1   1         NA       NA
# 2       1   2         NA       NA
# 3       1   3          0        0
# 4       1   4          1        2
# 5       1   5          2        2
# 6       1   6          0        0
# 7       1   7          1        1
# 8       1   8          0        0
# 9       2   1          0        0
# 10      2   2          1        3
# 11      2   3          2        3
# 12      2   4          3        3
# 13      2   5          0        0
# 14      2   6          1        2
# 15      2   7          2        2
# 16      2   8          0        0

Для различного количества дней

fillDays <- function(df){
    df$NewEvent <- df$EventCount

    max <- 0
    updateFrom <- 1
    Person <- 1
    for (i in 1:nrow(df)) {

        if(df$Person[i] != Person){
            max <- 0
            Person <- df$Person[i]
        }
        val <- dat$EventCount[i]

        if(is.na(val)){
            updateFrom =  updateFrom + 1

        } else if(val == 0) {

            if(updateFrom != i){
                df[updateFrom : (i-1), 'NewEvent'] <- max
            }
            max <- 0
            updateFrom = i + 1


        } else {
            if(val > max){
                max <- val
            }
        }
    }

    return(df)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...