добавление строк со значениями «0» за отсутствующие годы - PullRequest
0 голосов
/ 15 марта 2019

У меня есть вопрос, который чем-то похож на другие, которые были опубликованы, но после тщательного изучения нескольких сообщений я не могу заставить код работать. Любая помощь будет высоко ценится.

Мой фрейм данных выглядит так:

'data.frame':   501 obs. of  5 variables:
 $ Tattoo.MUM   : Factor w/ 250 levels "1004","1007",..: 76 76 76 81 81 81 85 85 85 85 ...
 $ OffspringMUMs: int  4 4 4 4 4 4 11 11 11 11 ...
 $ YearBIRTH.CUB: int  1988 1990 1991 1988 1991 2007 1989 1991 1992 1993 ...
 $ YearBIRTH.MUM: int  1991 1991 NA NA NA NA 1987 1987 1987 1987 ...
 $ OFFSpYR      : int  2 1 1 1 2 1 1 4 3 3 ...

Несколько строк здесь:

structure(list(Tattoo.MUM = structure(c(6L, 6L, 6L, 6L, 7L, 7L, 
7L, 8L, 9L, 11L, 11L, 11L, 11L, 5L, 1L, 4L, 2L, 3L, 3L, 10L, 
10L, 10L, 10L, 10L), .Label = c("10454", "1045A", "1045X", "12392", 
"1601", "22", "27", "29", "41", "424X", "60"), class = "factor"), 
OffspringMUMs = c(11L, 11L, 11L, 11L, 5L, 5L, 5L, 1L, 3L, 
7L, 7L, 7L, 7L, 1L, 2L, 1L, 1L, 4L, 4L, 6L, 6L, 6L, 6L, 6L
), YearBIRTH.CUB = c(1989L, 1991L, 1992L, 1993L, 1990L, 1991L, 
1993L, 1989L, 1988L, 1988L, 1989L, 1991L, 1994L, 2015L, 2012L, 
2015L, 2005L, 2009L, 2010L, 1996L, 1998L, 2000L, 2001L, 2006L
), YearBIRTH.MUM = c(1987L, 1987L, 1987L, 1987L, NA, NA, 
NA, NA, NA, 1987L, 1987L, 1987L, 1987L, NA, NA, NA, NA, 2005L, 
2005L, 1994L, 1994L, 1994L, 1994L, 1994L), OFFSpYR = c(1L, 
4L, 3L, 3L, 1L, 1L, 3L, 1L, 3L, 3L, 1L, 2L, 1L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L)), .Names = c("Tattoo.MUM", 
"OffspringMUMs", "YearBIRTH.CUB", "YearBIRTH.MUM", "OFFSpYR"), class = "data.frame", row.names = c(NA, 
-24L))

Я хочу добавить новые строки для всех пропущенных лет (YearBIRTH.CUB) в Tattoo.MUM, оставив остальные значения одинаковыми и добавив «0» к OFFSpYR.

Вот так:

structure(list(Tattoo.MUM = structure(c(6L, 6L, 6L, 6L, 6L, 7L, 
7L, 7L, 7L, 8L, 9L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 5L, 1L, 
4L, 2L, 3L, 3L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L), .Label = c("10454", "1045A", "1045X", "12392", "1601", 
"22", "27", "29", "41", "424X", "60"), class = "factor"), OffspringMUMs = c(11L, 
11L, 11L, 11L, 11L, 5L, 5L, 5L, 5L, 1L, 3L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 1L, 2L, 1L, 1L, 4L, 4L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L), YearBIRTH.CUB = c(1989L, 1990L, 1991L, 1992L, 1993L, 
1990L, 1991L, 1992L, 1993L, 1989L, 1988L, 1988L, 1989L, 1990L, 
1991L, 1992L, 1993L, 1994L, 2015L, 2012L, 2015L, 2005L, 2009L, 
2010L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 
2004L, 2005L, 2006L), YearBIRTH.MUM = c(1987L, 1987L, 1987L, 
1987L, 1987L, NA, NA, NA, NA, NA, NA, 1987L, 1987L, 1987L, 1987L, 
1987L, 1987L, 1987L, NA, NA, NA, NA, 2005L, 2005L, 1994L, 1994L, 
1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L
), OFFSpYR = c(1L, 0L, 4L, 3L, 3L, 1L, 1L, 0L, 3L, 1L, 3L, 3L, 
1L, 0L, 2L, 0L, 0L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 0L, 1L, 0L, 
1L, 2L, 0L, 0L, 0L, 0L, 1L)), .Names = c("Tattoo.MUM", "OffspringMUMs", 
"YearBIRTH.CUB", "YearBIRTH.MUM", "OFFSpYR"), class = "data.frame", row.names = c(NA, 
-35L))

Я пробовал:

 library(tidyr)
 library(dplyr)

 df1 <- pedMUM %>% group_by(Tattoo.MUM, OffspringMUMs) %>% complete(YearBIRTH.CUB = full_seq(YearBIRTH.CUB,1)) %>% fill(OFFSpYR=0)

library(data.table)

df1 <- setDT(pedMUM)[CJ(Tattoo.MUM=Tattoo.MUM, OffspringMUMs=OffspringMUMs, YearBIRTH.MUM=YearBIRTH.MUM, YearBIRTH.CUB=seq(min(YearBIRTH.CUB), max(YearBIRTH.CUB)), unique=TRUE),
                 on=.(Tattoo.MUM, OffspringMUMs, YearBIRTH.CUB),  roll=T]

Я, очевидно, неправильно использую tidyr, dplyr и data.table, потому что никто не дал мне желаемых результатов.

Я просматривал следующие сообщения:

Добавление строк с пропущенными годами по группам

Добавление строк со значениями «0» в кадр данных с отсутствующими данными

Найти пропущенный месяц после группировки с помощью dplyr

И даже пробовал петли:

R код - умный цикл для добавления строк

но я путаюсь, когда пытаюсь определить последовательность годов для каждого Tattoo.MUM в цикле.

Кто-нибудь сможет указать мне правильное направление?

1 Ответ

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

Я не использовал complete() раньше, но, похоже, работает следующее.nesting() позволяет хранить две переменные вместе, =full_seq() позволяет расширять значения переменной, fill=list() позволяет заполнять пробелы.

pedMUM <- structure(list(Tattoo.MUM = structure(c(6L, 6L, 6L, 6L, 7L, 7L,
7L, 8L, 9L, 11L, 11L, 11L, 11L, 5L, 1L, 4L, 2L, 3L, 3L, 10L,
10L, 10L, 10L, 10L), .Label = c("10454", "1045A", "1045X", "12392",
"1601", "22", "27", "29", "41", "424X", "60"), class = "factor"),
OffspringMUMs = c(11L, 11L, 11L, 11L, 5L, 5L, 5L, 1L, 3L,
7L, 7L, 7L, 7L, 1L, 2L, 1L, 1L, 4L, 4L, 6L, 6L, 6L, 6L, 6L
), YearBIRTH.CUB = c(1989L, 1991L, 1992L, 1993L, 1990L, 1991L,
1993L, 1989L, 1988L, 1988L, 1989L, 1991L, 1994L, 2015L, 2012L,
2015L, 2005L, 2009L, 2010L, 1996L, 1998L, 2000L, 2001L, 2006L
), YearBIRTH.MUM = c(1987L, 1987L, 1987L, 1987L, NA, NA,
NA, NA, NA, 1987L, 1987L, 1987L, 1987L, NA, NA, NA, NA, 2005L,
2005L, 1994L, 1994L, 1994L, 1994L, 1994L), OFFSpYR = c(1L,
4L, 3L, 3L, 1L, 1L, 3L, 1L, 3L, 3L, 1L, 2L, 1L, 1L, 2L, 1L,
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L)), .Names = c("Tattoo.MUM",
"OffspringMUMs", "YearBIRTH.CUB", "YearBIRTH.MUM", "OFFSpYR"), class = "data.frame", row.names = c(NA,
-24L))

library(tidyr)
library(dplyr)

df1 <- pedMUM %>%
    group_by(Tattoo.MUM) %>% # find min and max year for each mum
    mutate(
        minyear=min(YearBIRTH.CUB, na.rm=TRUE),
        maxyear=max(YearBIRTH.CUB, na.rm=TRUE)
    ) %>% 
    complete( # complete table
        nesting(Tattoo.MUM, minyear, maxyear, OffspringMUMs, YearBIRTH.MUM),
        YearBIRTH.CUB=full_seq(YearBIRTH.CUB, 1),
        fill=list(OFFSpYR=0)
        ) %>% 
    filter(YearBIRTH.CUB>=minyear & YearBIRTH.CUB<=maxyear) %>% # remove unwanted years
    select(names(pedMUM))  # return original column order
...