在复杂的数据结构中为具有条件的其他组成员赋值

Assign value to other group members with conditions in a complex data structure

一个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 阶段,一名小组成员被分配了一个独特的角色。

我的objective:在第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分成两个tibble,然后用David Arenburg建议的解决问题如下:

df_Stage2 <- df %>% filter (Stage == 2) %>%
  group_by(Group, Period) %>%
  mutate(newValue = Value[Role == 1]) %>%
  ungroup

但是,我相信有一种方法可以对整个数据结构进行处理。我尝试了 if_elsecase_when 方法,例如:

df <- df %>%
  group_by(Group, Period) %>%
  mutate(
    newValue = if_else(Stage == 1, -99, Value[Role == 1])
  ) %>%
  ungroup

但是,这两种方法都不起作用。有没有办法不用把df按Stage分成两个df就可以解决这个问题?非常感谢!

另外,在建议的解决方案中,他使用Value[Role == 1L]而不是Value[Role == 1],谁能解释一下这里的L是做什么的?

你可以在这里使用match -

library(dplyr)

df %>%
  group_by(Group, Stage, Period) %>%
  mutate(NewValue = ifelse(Stage == 2, Value[match(1, Role)], Value)) %>%
  ungroup()

#   Group Stage Period  Role Value NewValue
#   <int> <int>  <int> <int> <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