【问题标题】:Create new variable based on condition per group id根据每个组 id 的条件创建新变量
【发布时间】:2021-10-01 11:29:24
【问题描述】:

我想创建一个名为newcount 的新列,方法是在每个组id 中获取type 的第一个观察值的计数值。

df<-data.frame(id = c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3),
type = c("x","x","y","x","x","x","x","y","y","x","x","x","x","y","x","y","x","x"),
count = c(4,8,7,10,9,5,4,6,5,9,4,2,3,5,8,7,4,9))

期望的输出:

 id type  count  newcount
  1    x     4        7
  1    x     8        7
  1    y     7        7
  1    x    10        7
  2    x     9        6
  2    x     5        6
  2    y     4        6
  2    x     6        6
  2    y     5        6
  3    x     9        5
  3    x     4        5
  3    x     2        5
  3    x     3        5
  3    y     5        5
  3    x     8        5
  3    y     7        5
  3    x     4        5
  3    x     9        5

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您是否尝试过类似的方法:

    df %>% 
      group_by(id) %>%
      mutate(newcount = count[which(type == "y")[1]]) %>%
      ungroup()
    
          id type  count newcount
       <dbl> <chr> <dbl>    <dbl>
     1     1 x         4        7
     2     1 x         8        7
     3     1 y         7        7
     4     1 x        10        7
     5     2 x         9        6
     6     2 x         5        6
     7     2 x         4        6
     8     2 y         6        6
     9     2 y         5        6
    10     3 x         9        5
    11     3 x         4        5
    12     3 x         2        5
    13     3 x         3        5
    14     3 y         5        5
    15     3 x         8        5
    16     3 y         7        5
    17     3 x         4        5
    18     3 x         9        5
    

    (我没有得到你建议的相同结果,但我认为初始数据不完全相同)

    希望这是你想要的!

    【讨论】:

      【解决方案2】:

      您的意思是在每组id 中首先观察到y 值吗?

      这是一种使用match的方法。

      library(dplyr)
      
      df %>%
        group_by(id) %>%
        mutate(newcount = count[match('y', type)]) %>%
        ungroup
      
      #     id type  count newcount
      #   <dbl> <chr> <dbl>    <dbl>
      # 1     1 x         4        7
      # 2     1 x         8        7
      # 3     1 y         7        7
      # 4     1 x        10        7
      # 5     2 x         9        6
      # 6     2 x         5        6
      # 7     2 x         4        6
      # 8     2 y         6        6
      # 9     2 y         5        6
      #10     3 x         9        5
      #11     3 x         4        5
      #12     3 x         2        5
      #13     3 x         3        5
      #14     3 y         5        5
      #15     3 x         8        5
      #16     3 y         7        5
      #17     3 x         4        5
      #18     3 x         9        5
      

      【讨论】:

        【解决方案3】:

        使用which

        library(dplyr)
        df %>% 
           group_by(id) %>%
            mutate(newcount =  count[which(type =="y")[1]])
        

        -输出

        # A tibble: 18 × 4
        # Groups:   id [3]
              id type  count newcount
           <dbl> <chr> <dbl>    <dbl>
         1     1 x         4        7
         2     1 x         8        7
         3     1 y         7        7
         4     1 x        10        7
         5     2 x         9        6
         6     2 x         5        6
         7     2 x         4        6
         8     2 y         6        6
         9     2 y         5        6
        10     3 x         9        5
        11     3 x         4        5
        12     3 x         2        5
        13     3 x         3        5
        14     3 y         5        5
        15     3 x         8        5
        16     3 y         7        5
        17     3 x         4        5
        18     3 x         9        5
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-13
          • 1970-01-01
          • 2022-07-15
          • 1970-01-01
          相关资源
          最近更新 更多