【发布时间】:2021-11-20 03:01:55
【问题描述】:
MWE如下:
df = tibble(
Group = c(rep(1,9), rep(2,9)),
Stage = rep(c(1,1,1,rep(2,6)),2),
Period = rep(c(rep(1,6),2,2,2),2),
Role = rep(c(NA,NA,NA,0,1,0,0,0,1),2),
Value = round(rnorm(n=18,mean=10,sd=5), digits = 1)
)
# A tibble: 18 x 5
Group Stage Period Role Value
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 NA 10.8
2 1 1 1 NA 15.5
3 1 1 1 NA 7.4
4 1 2 1 0 3.7
5 1 2 1 1 6.7
6 1 2 1 0 7.5
7 1 2 2 0 15.1
8 1 2 2 0 8.2
9 1 2 2 1 5.1
10 2 1 1 NA 17.3
11 2 1 1 NA 14.9
12 2 1 1 NA 11.1
13 2 2 1 0 13.3
14 2 2 1 1 3.6
15 2 2 1 0 7.2
16 2 2 2 0 13.1
17 2 2 2 0 16.5
18 2 2 2 1 11
df 上的注释:在df 中,对于每个组,他们都会经历多个阶段的阶段 1 和阶段 2。在第 2 阶段,一个小组成员被分配一个独特的角色。
我的目标:在第 2 阶段,我想将 Role 1 的值分配给每个组的每个时期的其他组成员。期望的结果是:
# A tibble: 18 x 5
Group Stage Period Role Value newValue
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 NA 10.8 10.8
2 1 1 1 NA 15.5 15.5
3 1 1 1 NA 7.4 7.4
4 1 2 1 0 3.7 6.7
5 1 2 1 1 6.7 6.7
6 1 2 1 0 7.5 6.7
7 1 2 2 0 15.1 5.1
8 1 2 2 0 8.2 5.1
9 1 2 2 1 5.1 5.1
10 2 1 1 NA 17.3 17.3
11 2 1 1 NA 14.9 14.9
12 2 1 1 NA 11.1 11.1
13 2 2 1 0 13.3 3.6
14 2 2 1 1 3.6 3.6
15 2 2 1 0 7.2 3.6
16 2 2 2 0 13.1 11
17 2 2 2 0 16.5 11
18 2 2 2 1 11 11
我可以简单地将df通过Stage分成两个小标题,然后用David Arenburg建议的this method解决问题如下:
df_Stage2 <- df %>% filter (Stage == 2) %>%
group_by(Group, Period) %>%
mutate(newValue = Value[Role == 1]) %>%
ungroup
但是,我相信有一种方法可以处理整个数据结构。我试过if_else和case_when方法,例如:
df <- df %>%
group_by(Group, Period) %>%
mutate(
newValue = if_else(Stage == 1, -99, Value[Role == 1])
) %>%
ungroup
但是,这两种方法都不起作用。有没有办法在不将df 分阶段分成两个dfs 的情况下解决这个问题?非常感谢!
另外,在David Arenburg提出的解决方案中,他使用Value[Role == 1L]而不是Value[Role == 1],有没有人可以解释一下L在这里是做什么的?
【问题讨论】:
-
嗨,你能告诉我们想要的输出吗?
-
抱歉,应该改成
df_Stage2。我将在问题中显示预期的结果。
标签: r dataframe group-by conditional-formatting