gpt4 book ai didi

r - 查找经理经理 ID 的有效方法

转载 作者:行者123 更新时间:2023-12-04 12:01:29 24 4
gpt4 key购买 nike

我有一个员工数据库,带有他们的经理 ID,采用长格式(每个员工每月一行)。我想添加一个列,其中包含他们经理的经理 ID(或他们的跳过级别经理的 ID)。

这是一个玩具数据集:

id <- c(seq.int(1,11), seq.int(2,12))
mgr_id <- as.integer(c(NA, 1, 1, 2, 2, 2, 2, 3, 3, 5, 5, #period 1
NA, 2, 5, 2, 5, 5, 3, 3, 5, 10, 10)) #period 2
period <- c(rep(1, 11), rep(2, 11))
left_company <- c(1, rep(0, 21))
joined_company <- c(rep(0, 21), 1)

df <- data.frame(id, mgr_id, period, left_company, joined_company)

这是我编写的返回预期结果的函数。
# finds the employee's manager in the correct period, and returns that manager's id

get_mgr_mgr_id <- function(manager_id, period){
mgr_mgr_id <- df$mgr_id[df$id == manager_id & df$period == period]
return(mgr_mgr_id[1])
}

当我使用 mapply 的功能时, 一切都很好。请注意,员工 1 离开了公司,他们被员工 5 取代,员工 10 取代了员工,员工 12 取代了新员工。
df$mgr_mgr_id <- mapply(get_mgr_mgr_id, df$mgr_id, df$period)

df
id mgr_id period left joined mgr_mgr_id
1 1 NA 1 1 0 NA
2 2 1 1 0 0 NA
3 3 1 1 0 0 NA
4 4 2 1 0 0 1
5 5 2 1 0 0 1
6 6 2 1 0 0 1
7 7 2 1 0 0 1
8 8 3 1 0 0 1
9 9 3 1 0 0 1
10 10 5 1 0 0 2
11 11 5 1 0 0 2
12 2 NA 2 0 0 NA
13 3 2 2 0 0 NA
14 4 5 2 0 0 2
15 5 2 2 0 0 NA
16 6 5 2 0 0 2
17 7 5 2 0 0 2
18 8 3 2 0 0 2
19 9 3 2 0 0 2
20 10 5 2 0 0 2
21 11 10 2 0 0 5
22 12 10 2 0 1 5

我的问题: 有没有更有效的方法来获得这个结果? 目前,即使在 10,000 行上运行也需要相当长的时间,而我的数据集接近一百万。

我也愿意接受关于更一般问题标题的建议(可能是这个 SQL 问题的一个版本: Most efficient way to find something recursively in a table?)

最佳答案

您可以使用 data.table 运行连接。我不确定它会快多少:

library(data.table)
setDT(df)

df[, m2id := df[.(id = mgr_id, period = period), on=c("id", "period"), mgr_id]]

id mgr_id period left_company joined_company m2id
1: 1 NA 1 1 0 NA
2: 2 1 1 0 0 NA
3: 3 1 1 0 0 NA
4: 4 2 1 0 0 1
5: 5 2 1 0 0 1
6: 6 2 1 0 0 1
7: 7 2 1 0 0 1
8: 8 3 1 0 0 1
9: 9 3 1 0 0 1
10: 10 5 1 0 0 2
11: 11 5 1 0 0 2
12: 2 NA 2 0 0 NA
13: 3 2 2 0 0 NA
14: 4 5 2 0 0 2
15: 5 2 2 0 0 NA
16: 6 5 2 0 0 2
17: 7 5 2 0 0 2
18: 8 3 2 0 0 2
19: 9 3 2 0 0 2
20: 10 5 2 0 0 2
21: 11 10 2 0 0 5
22: 12 10 2 0 1 5
id mgr_id period left_company joined_company m2id

这个怎么运作

连接的语法是 x[i, on=, j] .它使用 ion子集 x然后返回 j .这里的关键是设置 id = mgr_idi所以我们子集到经理的行。

分配列的语法是 DT[, col_name := value] .在这种情况下,该值来自上一段中解释的连接。

关于r - 查找经理经理 ID 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com