我有如下所示的数据(真实的数据有更多的人和俱乐部):
Year Player Club
2005 Phelan Chicago Fire
2007 Phelan Boston Pant
2008 Phelan Boston Pant
2010 Phelan Chicago Fire
2002 John New York Jet
2006 John New York Jet
2007 John Atlanta Elephant
2009 John Chicago Fire我想为每个俱乐部计算一个俱乐部水平度量(previous_exp)。俱乐部是通过球员的流动而联系在一起的。"previous_exp“捕获了每个俱乐部的俱乐部级流入源。
例如,在芝加哥消防队,费兰在2005年来到这个俱乐部,然后离开了。他在2010年回来了。在费兰第一次留在芝加哥消防队之前,他没有任何经验(所以我们忽略了这一点)。然而,在他第二次留在芝加哥消防,他有5年的经验(2005-2009)在两个不同的俱乐部(芝加哥消防和波士顿潘特)。对于约翰来说,在他来到芝加哥消防之前,他有7年的经验(纽约喷气机和亚特兰大大象)。
对于芝加哥火,根据菲兰和约翰的职业记录,它总共积累了0+5+7=12年的经验,从其他俱乐部。在这12年中,2年来自芝加哥消防公司(假设2006年菲兰留在芝加哥消防公司)、3年来自波士顿彭特(假设2009年帕兰在波士顿潘特)、5年来自纽约喷气机(约翰2002-2006年)和2年来自亚特兰大大象(约翰2007-2008年)。
最后,我可以用公式计算芝加哥火灾的"previous_exp“:(经验长度1/年)^2+(经验长度2/年)^2+.,它等于(2/12)^2+(3/12)^2+(5/12)^2+(2/12)^2=0.292。我想为所有的俱乐部计算这个指标。下面是一个样本产出(注意到纽约喷气机是NA的,因为以前没有与纽约航空公司有关联的经验):
Club previous_exp
Chicago Fire 0.292
Boston Pant 1
New York Jet NA
Atlanta Elephant 1发布于 2022-05-17 13:47:15
因为单个先前停留的长度很重要,而且由于这些时间的积累,我们可以创建一个辅助函数来跟踪它们。
library(tidyverse)
df <- tribble(~Year, ~Player, ~Club,
2005, "Phelan", "Chicago Fire",
2007, "Phelan", "Boston Pant",
2008, "Phelan", "Boston Pant",
2010, "Phelan", "Chicago Fire",
2002, "John", "New York Jet",
2006, "John", "New York Jet",
2007, "John", "Atlanta Elephant",
2009, "John", "Chicago Fire") %>%
mutate(Year = as.integer(Year))
helper <- function(vec){
n <- length(vec)
output <- vector("list", n)
for(i in 1:n){
output[[i]] <- vec[1:i]
}
output
}
df %>%
group_by(Player) %>%
arrange(Year, .by_group = TRUE) %>%
filter(Club != lag(Club, default = "")) %>% # Must remove Phelan's second Boston Pant stay
mutate(experience_this_row = Year - lag(Year)) %>%
na.omit() %>%
mutate(experience_list = helper(experience_this_row)) %>%
group_by(Club) %>%
summarize(previous_exp = unlist(list(experience_list))) %>%
summarize(previous_exp = sum( (previous_exp/sum(previous_exp))^2))Club的总结可能会有一种更顺畅的方法。上面的内容对我有用,但我对连续的summarize调用感到有点困惑.
https://stackoverflow.com/questions/72219105
复制相似问题