假设我有下面的data
:
| 日期|姓名|角色名称|
| - ------| - ------| - ------|
| 二○ ○九年十二月一日|约翰|助手|
| 2010年12月1日|约翰|助手|
| 2011年12月1日|约翰|高级助手|
| 2012年12月1日|约翰|经理|
| 二○ ○九年十二月一日|威尔|助手|
| 2010年12月1日|威尔|高级助手|
| 2011年12月1日|威尔|经理|
| 2012年12月1日|威尔|高级经理|
我正尝试根据name
列中人员的rolename
列(人员迄今为止工作过)来计算角色数。例如,对于上述数据,我希望第四列用于度量人员迄今为止工作过的职位数:
| 日期|姓名|角色名称|无位置|
| - ------| - ------| - ------| - ------|
| 二○ ○九年十二月一日|约翰|助手|1个|
| 2010年12月1日|约翰|助手|1个|
| 2011年12月1日|约翰|高级助手|第二章|
| 2012年12月1日|约翰|经理|三个|
| 二○ ○九年十二月一日|威尔|助手|1个|
| 2010年12月1日|威尔|高级助手|第二章|
| 2011年12月1日|威尔|经理|三个|
| 2012年12月1日|威尔|高级经理|四个|
我失败的尝试:
#attempt 1
library(dplyr)
data %>%
group_by(name) %>%
mutate(nopositions = count(rolename))
#attempt2
library(runner)
data %>%
group_by(name) %>%
mutate(nopositions = runner(x = rolename,
k = inf,
idx = date,
f = function(x) length(x))
1条答案
按热度按时间x4shl7ld1#
假设按
date
的顺序是确定的,我们可以不使用
cummax
,除非name
返回到先前的rolename
,它的noposition
将 * 减小 *(恢复到先前的值)。这是假设
unique
保持了第一次出现的自然顺序,如果出现了什么问题(我一时想不出什么问题),我们可以做一个单词窗口:这在这里产生了相同的结果,并且它在较大的组中执行得更差(因为它迭代得更多)。我将它作为一个扩展提供,以防假设排除了
cummax(match(..))
的使用。