按组计算的 R Dataframe
R Dataframe By Group Calculation
我有如下数据框(真实数据有更多的人和俱乐部):
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 年回归。在 Phelan 第一次留在芝加哥火焰之前,他之前的经验为零(所以我们忽略它)。然而,在他第二次留在芝加哥火焰之前,他在两个不同的俱乐部(芝加哥火焰和波士顿潘特)有 5 年的经验(2005-2009)。对于John来说,在他来到Chicago Fire之前,他有7年的从业经历(New York Jet和Atlanta Elephant)。
对于芝加哥火焰来说,根据费兰和约翰的职业生涯记录,一共积累了0+5+7=12年的其他俱乐部经验。这12年中,2年来自Chicago Fire本身(Phelan 2005-2006假设2006 Phelan留在Chicago Fire),3年来自Boston Pant(Phelan 2007-2009假设2009 Phelan留在Boston Pant),5年来自New York Jet (John 2002-2006) 和 2 年来自 Atlanta Elephant (John 2007-2008)。
最后,我可以使用以下公式计算芝加哥大火的“previous_exp”:(经验长度 1/总年数)^2+(经验长度 2/总年数)^2+ ......,等于(2/12)^2+(3/12)^2+(5/12)^2+(2/12)^2=0.292。我想为所有俱乐部计算这个指标。下面是一个示例输出(注意 New York Jet 是 NA,因为之前没有经验与 New York Jet 相关联):
Club previous_exp
Chicago Fire 0.292
Boston Pant 1
New York Jet NA
Atlanta Elephant 1
因为个人之前停留的时长很重要,而且这些会随着时间的推移而累积,我们可以制作一个辅助函数来跟踪这些。
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
调用让我有点迷惑...
我有如下数据框(真实数据有更多的人和俱乐部):
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 年回归。在 Phelan 第一次留在芝加哥火焰之前,他之前的经验为零(所以我们忽略它)。然而,在他第二次留在芝加哥火焰之前,他在两个不同的俱乐部(芝加哥火焰和波士顿潘特)有 5 年的经验(2005-2009)。对于John来说,在他来到Chicago Fire之前,他有7年的从业经历(New York Jet和Atlanta Elephant)。
对于芝加哥火焰来说,根据费兰和约翰的职业生涯记录,一共积累了0+5+7=12年的其他俱乐部经验。这12年中,2年来自Chicago Fire本身(Phelan 2005-2006假设2006 Phelan留在Chicago Fire),3年来自Boston Pant(Phelan 2007-2009假设2009 Phelan留在Boston Pant),5年来自New York Jet (John 2002-2006) 和 2 年来自 Atlanta Elephant (John 2007-2008)。
最后,我可以使用以下公式计算芝加哥大火的“previous_exp”:(经验长度 1/总年数)^2+(经验长度 2/总年数)^2+ ......,等于(2/12)^2+(3/12)^2+(5/12)^2+(2/12)^2=0.292。我想为所有俱乐部计算这个指标。下面是一个示例输出(注意 New York Jet 是 NA,因为之前没有经验与 New York Jet 相关联):
Club previous_exp
Chicago Fire 0.292
Boston Pant 1
New York Jet NA
Atlanta Elephant 1
因为个人之前停留的时长很重要,而且这些会随着时间的推移而累积,我们可以制作一个辅助函数来跟踪这些。
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
调用让我有点迷惑...