studio - Expanda data.frame creando duplicados según la condición del grupo(2)
eliminar filas en r (1)
Aquí hay una solución que mantiene los valores de ID como se indica arriba.
#first add grouping variables
df$smalldaygroup <- c(0,cumsum(sapply(2:nrow(df),function(i) df$Day[i]!=df$Day[i-1]))) #individual days
df$bigdaygroup <- c(0,cumsum(sapply(2:nrow(df),function(i) df$Day[i]<df$Day[i-1]-1))) #blocks of consecutive days
#duplicate individual days except the first in each big group
df2 <- lapply(split(df,df$bigdaygroup),function(x)
split(x,x$smalldaygroup)[c(1,rep(2:length(split(x,x$smalldaygroup)),each=2))])
#change the Count_group to previous value in alternate entries
df2 <- lapply(df2,function(L) lapply(1:length(L),function(i) {
x <- L[[i]]
if(!(i%%2)) x$Count_group <- L[[i-1]]$Count_group[1]
return(x)
}))
df2 <- do.call(rbind,unlist(df2,recursive=FALSE)) #bind back together
head(df2,20) #ignore rownames!
ID Day Count Count_group
01.1 18 1933 6 11
01.2 33 1933 6 11
01.3 37 1933 6 11
01.4 18 1933 6 11
01.5 16 1933 6 11
01.6 11 1933 6 11
02.7 111 1932 5 11
02.8 34 1932 5 11
02.9 60 1932 5 11
02.10 88 1932 5 11
02.11 18 1932 5 11
03.7 111 1932 5 8
03.8 34 1932 5 8
03.9 60 1932 5 8
03.10 88 1932 5 8
03.11 18 1932 5 8
04.12 33 1931 3 8
04.13 13 1931 3 8
04.14 56 1931 3 8
05.12 33 1931 3 4
A partir de la respuesta / código de @AndrewGustar : expanda data.frame creando duplicados según la condición del grupo
1) ¿Qué pasa si tengo los datos de entrada.frame con valores de ID
no en secuencia y que también pueden duplicarse?
Ejemplo data.frame:
df = read.table(text = ''ID Day Count Count_group
18 1933 6 11
33 1933 6 11
37 1933 6 11
18 1933 6 11
16 1933 6 11
11 1933 6 11
111 1932 5 8
34 1932 5 8
60 1932 5 8
88 1932 5 8
18 1932 5 8
33 1931 3 4
13 1931 3 4
56 1931 3 4
23 1930 1 1
6 1800 6 10
37 1800 6 10
98 1800 6 10
52 1800 6 10
18 1800 6 10
76 1800 6 10
55 1799 4 6
6 1799 4 6
52 1799 4 6
133 1799 4 6
112 1798 2 2
677 1798 2 2
778 888 4 6
111 888 4 6
88 888 4 6
10 888 4 6
37 887 2 3
26 887 2 3
8 886 1 2
56 885 1 1'', header = TRUE)
La columna de Count
muestra la cantidad total de valores de ID
por cada Day
y la columna de Count_group
muestra la suma de los valores de ID
por cada Day
y Day - 1
.
por ejemplo, 1933 = Count_group
11 porque Count
6 (1933) + Count
5 (1932), y así sucesivamente.
Lo que tengo que hacer es crear observaciones duplicadas por cada Count_group
y agregarlas para mostrar por cada Count_group
su Day
AND Day - 1
.
por ejemplo, Count_group
= 11 está compuesto por los valores de Count
del Day
1933 y 1932. Por lo tanto, ambos días deben incluirse en Count_group
= 11. El siguiente será Count_group
= 8, compuesto por 1932 y 1931, etc ...
Salida deseada:
ID Day Count Count_group
18 1933 6 11
33 1933 6 11
37 1933 6 11
18 1933 6 11
16 1933 6 11
11 1933 6 11
111 1932 5 11
34 1932 5 11
60 1932 5 11
88 1932 5 11
18 1932 5 11
111 1932 5 8
34 1932 5 8
60 1932 5 8
88 1932 5 8
18 1932 5 8
33 1931 3 8
13 1931 3 8
56 1931 3 8
33 1931 3 4
13 1931 3 4
56 1931 3 4
23 1930 1 4
23 1930 1 1
6 1800 6 10
37 1800 6 10
98 1800 6 10
52 1800 6 10
18 1800 6 10
76 1800 6 10
55 1799 4 10
6 1799 4 10
52 1799 4 10
133 1799 4 10
55 1799 4 6
6 1799 4 6
52 1799 4 6
133 1799 4 6
112 1798 2 6
677 1798 2 6
112 1798 2 2
677 1798 2 2
778 888 4 6
111 888 4 6
88 888 4 6
10 888 4 6
37 887 2 6
26 887 2 6
37 887 2 3
26 887 2 3
8 886 1 3
8 886 1 2
56 885 1 2
56 885 1 1