我有一個如下所示的資料框:
Year Person Office
2005 Peter Boston
2007 Peter Boston
2008 Peter Chicago
2009 Peter New York
2011 Peter New York
2003 Amy Seattle
2004 Amy Boston
2006 Amy Chicago
2007 Amy Chicago
我想計算一個辦公室人員級別的標準化度量(計數),它捕獲一個人在到達當前辦公室之前經歷的辦公室數量。該度量通過到達當前位置之前的總年數進行標準化。下面是理想的輸出。對于彼得來說,波士頓是他的第一個辦公室,因此他在波士頓的標準化度量計數是 0。對于彼得來說,芝加哥是他的第二個辦公室,他在 2008-2005=3 年之后才來到芝加哥辦公室。因此,他對芝加哥的標準化測量計數是 1/3。
Office Person Count
Boston Peter 0
Boston Amy 1
Chicago Peter 1/3
Chicago Amy 2/3
New York Peter 1/2
Seattle Amy 0
uj5u.com熱心網友回復:
你可以使用
library(dplyr)
df %>%
group_by(Person, Office) %>%
slice_min(Year) %>%
arrange(Year) %>%
add_count() %>%
group_by(Person) %>%
mutate(Count = if_else(cumsum(n) == 1, 0, (cumsum(n) - 1) / (Year - first(Year))),
.keep = "unused") %>%
ungroup()
這回傳
# A tibble: 6 x 3
Person Office Count
<chr> <chr> <dbl>
1 Amy Seattle 0
2 Amy Boston 1
3 Peter Boston 0
4 Amy Chicago 0.667
5 Peter Chicago 0.333
6 Peter New_York 0.5
uj5u.com熱心網友回復:
library(tidyverse)
cities %>%
group_by(Person, Office) %>%
filter(row_number() == 1) %>%
group_by(Person) %>%
mutate(x = row_number()-1, y = (Year - Year[1])) %>%
mutate(count = ifelse(is.nan(x / y), x, x/y))
# Year Person Office x y test
# <int> <chr> <chr> <dbl> <int> <dbl>
# 1 2005 Peter "Boston" 0 0 0
# 2 2008 Peter "Chicago" 1 3 0.333
# 3 2009 Peter "New York" 2 4 0.5
# 4 2003 Amy "Seattle " 0 0 0
# 5 2004 Amy "Boston" 1 1 1
# 6 2006 Amy "Chicago" 2 3 0.667
如果您希望將計數表示為分數,我們可以使用包中的輔助函式pracma來減少分數
cities %>%
group_by(Person, Office) %>%
filter(row_number() == 1) %>%
group_by(Person) %>%
mutate(x = row_number()-1, y = (Year - Year[1])) %>%
mutate(count = ifelse(is.nan(x / y), x, x/y)) %>%
mutate(frac = ifelse(x == 0,
0,
ifelse(x/y == 1, 1,
paste0(x / pracma::gcd(x,y), "/", y / pracma::gcd(x,y)))
)
) %>%
select(-x, -y)
# Year Person Office count frac
# <int> <chr> <chr> <dbl> <chr>
# 1 2005 Peter "Boston" 0 0
# 2 2008 Peter "Chicago" 0.333 1/3
# 3 2009 Peter "New York" 0.5 1/2
# 4 2003 Amy "Seattle " 0 0
# 5 2004 Amy "Boston" 1 1
# 6 2006 Amy "Chicago" 0.667 2/3
資料:
cities <- read.delim(text = "Year,Person,Office
2005,Peter,Boston
2007,Peter,Boston
2008,Peter,Chicago
2009,Peter,New York
2011,Peter,New York
2003,Amy,Seattle
2004,Amy,Boston
2006,Amy,Chicago
2007,Amy,Chicago", sep = ",")
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467226.html
上一篇:基于R中的行列相似性修剪資料框
