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
我有一个数据框如下所示(真实数据有更多人):
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