R Dataframe 加权度量(按组)

R Dataframe Weighted Measure by Group

我有一个数据框如下所示(真实数据有更多人):

Year   Person    Office
2005   Lauren    Boston 
2007   Lauren    Boston
2008   Lauren    Chicago 
2010   Lauren    Boston 
2012   Lauren    New York
2013   Lauren    New York 
2007   Kate      Atlanta
2009   Kate      Atlanta

我想计算一个办公室人员级别的度量(计数),它捕获一个人在来到当前办公室之前经历过的办公室的加权数量。公式为(以往经历长度1/担任现职前历年总数)^2+(历年经历长度2/担任现职前历年总数)^2+……

下面是理想的输出。对 Lauren 来说,波士顿是她的第一个办公室。因此,她在波士顿的计数为 0。对于 Lauren,芝加哥是她的第二个办公室,她在来到芝加哥办公室之前度过了 2008-2005=3 年。因此,她对芝加哥的计数是 (3/3)^2=1。然后,劳伦第二次回到波士顿。在这里,她有过两次工作经历(波士顿 3 年,芝加哥 2 年(2010-2008))。因此,她对第二次波士顿体验的计数是 (3/5)^2+(2/5)^2=0.52.

Office    Person  Count
Boston    Lauren  0
Chicago   Lauren  1
Boston    Lauren  0.52
New York  Lauren  0.3469
Atlanta   Kate    0

您可以使用类似 中的方法:

library(dplyr)

df %>% 
  group_by(Person, Office, grp = cumsum(coalesce(Office != lag(Office), TRUE))) %>% 
  slice(1) %>% 
  arrange(Year) %>% 
  group_by(Person) %>% 
  mutate(
    tmp_cnt = if_else(
      row_number() == 1, 
      0, 
      (Year - lag(Year))^2 
      ),
    Count = if_else((Year - first(Year))^2 == 0, 0, cumsum(tmp_cnt) / (Year - first(Year))^2)
    ) %>% 
  select(-grp, -tmp_cnt) %>% 
  ungroup()

这个returns

# A tibble: 5 x 4
   Year Person Office   Count
  <dbl> <chr>  <chr>    <dbl>
1  2005 Lauren Boston   0    
2  2007 Kate   Atlanta  0    
3  2008 Lauren Chicago  1    
4  2010 Lauren Boston   0.52 
5  2012 Lauren New_York 0.347