首页 > 解决方案 > R按组过滤值填充新列

问题描述

我想在我的 中创建新列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))

使用处理数据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") 

对应的填充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

标签: rfilterdplyrexpand

解决方案


您可以使用 :

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

如果组中可能有多个regime具有值的值,则可以使用/"SA"选择第一个值。which.maxmatch

dat %>%
  group_by(id) %>%
  mutate(value.sa = value[which.max(regime == 'SA')])

推荐阅读