从@AndrewGustar开始回答/代码:Expand data.frame by creating duplicates based on group condition
1)
如果我的输入data.frame的ID
值不是按顺序排列并且也可以复制它们呢?
示例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)
Count
列显示每个ID
的{{1}}值总数,而Day
列显示每个Count_group
值的总和{ {1}}和ID
。
e.g。 1933 = Day
11因为Day - 1
6(1933)+ Count_group
5(1932),依此类推。
我需要做的是为每个Count
创建重复的观察结果并将其添加到其中,以便按Count
Count_group
和Count_group
显示每个Day
。< / p>
e.g。 Day - 1
= 11由Count_group
1933年和1932年的Count
值组成。因此,这两天都需要包含在Day
= 11中。下一个将是{ {1}} = 8,由1932年和1931年等组成......
期望的输出:
Count_group
答案 0 :(得分:1)
这是一个保持ID值如上的解决方案。
#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