R按组过滤值填充新列

may*_*cca 1 expand r filter dplyr

我想在 my 中创建新列dat,由满足条件的值填充。所以,我想保留valuewhere whereregime == "SA"并在 new column 中的整个组中填充此值vals.sa

这结合了filterand mutate,但我不确定它们的正确组合是什么?Filter只是保持行满足条件,但如何在组中的所有行上扩展此值?

我的数据:

dat <- data.frame(id = c(1,1,2,2,2,2,3,3),
                  regime = c("SA", "B", "SA", "B", "C", "F", "SA", "D"),
                  value = c(3,5,1,2,5,6,7,8))
Run Code Online (Sandbox Code Playgroud)

使用处理数据 dplyr

dat %>% 
  # group data by id
  group_by(id) %>%           
  # how to write this condition and get values instead or TRUE/FALSE?
  mutate(val.sa = regime == "SA") 
Run Code Online (Sandbox Code Playgroud)

与填充val.sa值对应的预期输出regime == "SA"

     id regime value val.sa
  <dbl> <fct>  <dbl>  <dbl>
1     1 SA         3      3
2     1 B          5      3
3     2 SA         1      1
4     2 B          2      1
5     2 C          5      1
6     2 F          6      1
7     3 SA         7      7
8     3 D          8      7
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 5

您可以使用 :

library(dplyr)
dat %>%
  group_by(id) %>%
  mutate(value.sa = value[regime == 'SA'])
  #OR
  #mutate(value.sa = value[match('SA', regime)])


#     id regime value value.sa
#  <dbl> <chr>  <dbl>    <dbl>
#1     1 SA         3        3
#2     1 B          5        3
#3     2 SA         1        1
#4     2 B          2        1
#5     2 C          5        1
#6     2 F          6        1
#7     3 SA         7        7
#8     3 D          8        7
Run Code Online (Sandbox Code Playgroud)

如果regime一个组中有多个值"SA",您可以使用which.max/选择第一个值match

dat %>%
  group_by(id) %>%
  mutate(value.sa = value[which.max(regime == 'SA')])
Run Code Online (Sandbox Code Playgroud)