这是我的data.frame的一个例子:
df = read.table(text = 'ID Day Count Count_group
1001 1933 6 11
1002 1933 6 11
1003 1933 6 11
1004 1933 6 11
1005 1933 6 11
1006 1933 6 11
1007 1932 5 8
1008 1932 5 8
1009 1932 5 8
1010 1932 5 8
1011 1932 5 8
1012 1931 3 4
1013 1931 3 4
1014 1931 3 4
1015 1930 1 1
1016 1800 6 10
1017 1800 6 10
1018 1800 6 10
1019 1800 6 10
1020 1800 6 10
1021 1800 6 10
1022 1799 4 6
1023 1799 4 6
1024 1799 4 6
1025 1799 4 6
1026 1798 2 2
1027 1798 2 2
1028 888 4 6
1029 888 4 6
1030 888 4 6
1031 888 4 6
1032 887 2 3
1033 887 2 3
1034 886 1 2
1035 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中。
下一个将是Count_group = 8,由1932年和1931年等组成......
预期产出:
Count_group
你有什么建议吗?
答案 0 :(得分:1)
我认为这可以满足您的需求......
#first add a grouping variable
df$daygroup <- c(0,cumsum(sapply(2:nrow(df),function(i) df$Day[i]!=df$Day[i-1])))
#split df into a list of data frames, loop through them to add extra rows,
#and bind them back together
df2 <- do.call(rbind,lapply(split(df,df$daygroup),function(x){
n <- nrow(x)
m <- x$Count_group[1] #number of rows needed for Day
if(m>n){
y <- rbind(x,data.frame(ID=(x$ID[n]+1):(x$ID[n]+m-n), #continue numbering
Day=x$Day[1]-1, #previous day
Count=m-x$Count[1], #difference in count
Count_group=m,
daygroup=x$daygroup[1]))
} else {
y <- x #no extra rows needed
}
return(y)
}
))
df2$daygroup <- NULL #remove grouping variable
head(df2,20) #ignore the rownames!
ID Day Count Count_group
0.1 1001 1933 6 11
0.2 1002 1933 6 11
0.3 1003 1933 6 11
0.4 1004 1933 6 11
0.5 1005 1933 6 11
0.6 1006 1933 6 11
0.7 1007 1932 5 11
0.8 1008 1932 5 11
0.9 1009 1932 5 11
0.10 1010 1932 5 11
0.11 1011 1932 5 11
1.7 1007 1932 5 8
1.8 1008 1932 5 8
1.9 1009 1932 5 8
1.10 1010 1932 5 8
1.11 1011 1932 5 8
1.1 1012 1931 3 8
1.2 1013 1931 3 8
1.3 1014 1931 3 8
2.12 1012 1931 3 4