通过基于组条件创建重复项来扩展data.frame

时间:2017-05-29 09:48:29

标签: r dataframe duplicates grouping add

这是我的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_groupCount_group显示每个Day。< / p>

e.g。 Day - 1 = 11由Count_group 1933年和1932年的Count值组成。因此,这两天都需要包含在Day = 11中。 下一个将是Count_group = 8,由1932年和1931年等组成......

预期产出:

Count_group

你有什么建议吗?

1 个答案:

答案 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