头和尾分组

时间:2017-08-20 19:18:48

标签: r dataframe

在我引起混淆之后,我再次重新发布这个问题,为此道歉。我相信现在的例子是正确的。

示例数据:

df <- data.frame(group=rep(c("A","B","C"),c(8,10,8)), size=c(rep(1000,5),rep(0,3),rep(2000,7),rep(0,3),rep(5000,5),rep(0,3)),
         out=c(rep(0,5),rnorm(3,5,1),rep(0,7),rnorm(3,5,1),rep(0,5),rnorm(3,5,1)),
         g1=rbinom(26,1,.5),g2=rbinom(26,1,.5),g3=rbinom(26,1,.5))


   group size      out g1 g2 g3
1      A 1000 0.000000  0  0  1
2      A 1000 0.000000  0  1  0
3      A 1000 0.000000  0  1  0
4      A 1000 0.000000  0  1  0
5      A 1000 0.000000  0  0  1
6      A    0 3.997360  1  1  0
7      A    0 4.992823  1  0  1
8      A    0 5.644386  1  1  1
9      B 2000 0.000000  1  1  0
10     B 2000 0.000000  0  1  1
11     B 2000 0.000000  0  0  0
12     B 2000 0.000000  1  0  1
13     B 2000 0.000000  1  1  0
14     B 2000 0.000000  1  0  1
15     B 2000 0.000000  1  1  1
16     B    0 5.247895  1  0  0
17     B    0 5.248148  0  0  1
18     B    0 5.026844  1  1  1
19     C 5000 0.000000  0  0  0
20     C 5000 0.000000  0  1  0
21     C 5000 0.000000  0  1  1
22     C 5000 0.000000  0  0  0
23     C 5000 0.000000  1  0  1
24     C    0 6.532156  1  1  0
25     C    0 5.457338  0  0  0
26     C    0 4.675683  1  1  1

我想获得这个:

   group size      out  g1 g2 g3
1      A 1000 0.000000  1  1  1
6      A    0 7.276473  0  0  1
9      B 2000 0.000000  0  0  0
16     B    0 5.630425  1  0  0
19     C 5000 0.000000  0  0  0
24     C    0 5.449923  1  0  1

最终输出是:

   group size      out g1 g2 g3
6      A    0 7.276473  1  1  1
16     B    0 5.630425  0  0  0
24     C    0 5.449923  0  0  0

基本上将第一行(每组)中g1-g3的值替换为每组第二行中的值。我正在寻找基础解决方案。

解决方案是:

1)如果out == 0且size> 0,则选择每组第一行(第1行),并选择每个给定组的第一行!= 0且size == 0(第2行)。

2)从第一行替换虚拟g1-g3并替换每组第二行。

3)每组仅保留最后一行。

这是可能的(部分)解决方案:

sol <- with(df, by(df, group, function(x) rbind(head(x[(x$size>0 & x$out==0), ],1),head(x[x$size==0 & x$out!=0, ],1))))
data.frame(do.call(rbind,sol),check.names=FALSE)

1 个答案:

答案 0 :(得分:1)

为了制作可重复的示例,当您使用RNG或ZonedDateTime zdtStart = interval.getStart().atZone( z ); // Or `getEnd()`. 时,您应始终sample

set.seed()