在我引起混淆之后,我再次重新发布这个问题,为此道歉。我相信现在的例子是正确的。
示例数据:
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)
答案 0 :(得分:1)
为了制作可重复的示例,当您使用RNG或ZonedDateTime zdtStart = interval.getStart().atZone( z ); // Or `getEnd()`.
时,您应始终sample
。
set.seed()