Scale relative to a value in each group (via dplyr)

后端 未结 3 504
抹茶落季
抹茶落季 2020-12-30 09:21

I have a set of time series, and I want to scale each of them relative to their value in a specific interval. That way, each series will be at 1.0 at that time and change pr

相关标签:
3条回答
  • 2020-12-30 09:32

    This solution is very similar to @thelatemail, but I think it's sufficiently different enough to merit its own answer because it chooses the index based on a condition:

    data %>%
        group_by(category) %>%
        mutate(value = value/value[year == baseYear])
    
    #   category  year      value
    #...     ...   ...       ...
    #7         A  2002 1.00000000
    #8         B  2002 1.00000000
    #9         C  2002 1.00000000
    #10        A  2003 0.86462789
    #11        B  2003 1.07217943
    #12        C  2003 0.82209897
    

    (Data output has been truncated. To replicate these results, set.seed(123) when creating data.)

    0 讨论(0)
  • 2020-12-30 09:32

    Something like this:

    data %>% 
      group_by(category) %>% 
      mutate(value=value/value[1]) %>%
      arrange(category,year)
    

    Result:

    #   category year     value
    #1         A 2000 1.0000000
    #2         A 2001 0.2882984
    #3         A 2002 1.5224308
    #4         A 2003 0.8369343
    #5         A 2004 2.0868684
    #6         A 2005 0.2196814
    #7         B 2000 1.0000000
    #8         B 2001 0.5952027
    
    0 讨论(0)
  • 2020-12-30 09:41

    Use first in dplyr, ensuring you use order_by

    data %>% 
      group_by(category) %>% 
      mutate(value = value / first(value, order_by = year))
    
    0 讨论(0)
提交回复
热议问题