【问题标题】:Assign value to other group members with conditions in a complex data structure在复杂的数据结构中为具有条件的其他组成员赋值
【发布时间】: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_elsecase_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


【解决方案1】:

你可以在这里使用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  

【讨论】:

  • 非常感谢!看起来很简单。所以,在我尝试解决if_else 的问题时,如果我将Stage 添加到我的group_by 函数中,它应该可以工作,对吧?
  • 没错。它适用于本示例,但如果 Role = 1 的值超过 1 个,它将失败。 match 默认返回第一个的索引。
猜你喜欢
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2016-11-05
  • 2020-05-06
相关资源
最近更新 更多