代码之家  ›  专栏  ›  技术社区  ›  maycca

R按组按筛选值填充新列

  •  0
  • maycca  · 技术社区  · 5 年前

    我想在我的 dat 满足一个条件。所以,我想保留 value regime == "SA" 并将此值填入整个组的新列中 vals.sa .

    filter 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 值对应

         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
    
    3 回复  |  直到 5 年前
        1
  •  4
  •   Ronak Shah    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
    

    regime 在一个有价值的群体里 "SA" which.max / match .

    dat %>%
      group_by(id) %>%
      mutate(value.sa = value[which.max(regime == 'SA')])
    
        2
  •  3
  •   mnist    5 年前

    以防你一直只有一个 SA 在每个组中,此操作应该不会出现任何错误:

    dat %>% 
      group_by(id) %>%             
      mutate(val.sa = value[regime == "SA"]) 
    #> # A tibble: 8 x 4
    #> # Groups:   id [3]
    #>      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
    

    否则,你必须决定 沙特阿拉伯 -你想保留的价值。例如,始终保持最大值:

    dat <- data.frame(id = c(1,1,2,2,2,2,3,3),
                      regime = c("SA", "B", "SA", "SA", "C", "F", "SA", "D"),
                      value = c(3,5,1,2,5,6,7,8))
    dat
    #>   id regime value
    #> 1  1     SA     3
    #> 2  1      B     5
    #> 3  2     SA     1
    #> 4  2     SA     2
    #> 5  2      C     5
    #> 6  2      F     6
    #> 7  3     SA     7
    #> 8  3      D     8
    
    dat %>% 
      group_by(id) %>%             
      mutate(val.sa = max(value[regime == "SA"]))
    #> # A tibble: 8 x 4
    #> # Groups:   id [3]
    #>      id regime value val.sa
    #>   <dbl> <fct>  <dbl>  <dbl>
    #> 1     1 SA         3      3
    #> 2     1 B          5      3
    #> 3     2 SA         1      2
    #> 4     2 SA         2      2
    #> 5     2 C          5      2
    #> 6     2 F          6      2
    #> 7     3 SA         7      7
    #> 8     3 D          8      7
    
        3
  •  2
  •   Rui Barradas    5 年前

    val.sa 首先在 SA 与中的值相等的行 value 列。然后分组依据 id fill 趴下。这样地:

    dat %>%
      mutate(val.sa = ifelse(regime == 'SA', value, NA)) %>%
      group_by(id) %>%
      fill(val.sa)
    ## A tibble: 8 x 4
    ## Groups:   id [3]
    #     id regime value val.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
    
        4
  •  1
  •   akrun    5 年前

    我们可以利用 case_when

    library(dplyr)
    library(tidyr)
     dat %>%
         mutate(val.sa = case_when(regime == 'SA' ~ value) %>%
         group_by(id) %>%
         fill(val.sa)
    
    推荐文章