如何解决通过while循环或Reduce的多级员工经理关系,仅基于R
我的问题可以看作是 SO 上已经解决的 problem 的扩展。
为了重现,我在办公室有多层员工-经理关系,比如这样
manager employee
1 CEO sally
2 sally sue
3 sally paul
4 sue mary
5 mary greg
6 mary don
我必须仅根据 baseR 中可用的方法/函数来解决这个问题。我尝试使用自身 merge
数据(3 次)以获得我期望的结果 -
manager employee manager2 manager3 manager4
1 CEO sally <NA> <NA> <NA>
2 sally sue CEO <NA> <NA>
3 sally paul CEO <NA> <NA>
4 sue mary sally CEO <NA>
5 mary greg sue sally CEO
6 mary don sue sally CEO
我试图通过 while loop
解决它,但由于中间级别的数量未知,我一直在告诉循环在哪里停止。由于这个原因,我假设它也无法通过 Reduce
或类似的 purrr
函数解决。我不想要基于 'hR,
data.tree,'igraph
之类的包的答案,因为这些答案已经在某个地方或其他地方可用。非常欢迎 BaseR 或 tidyverse。
dput 如下
df <- data.frame(manager = c("CEO","sally","sue","mary","mary"),employee = c("sally","paul","greg","don"),stringsAsFactors = FALSE)
我尝试的是这样的。
df |>
merge(df,by.x = 'manager',by.y = 'employee',suffixes = c('','2'),all.x = T) |>
merge(df,by.x = 'manager2','3'),by.x = 'manager3','4'),all.x = T)
解决方法
使用相同的合并解决方案,您可以使用终止条件来判断由此产生的管理人员稀疏向量是否有任何管理人员也是雇员。这与发布的代码相同,但通过 while 循环执行。
df_new <- df
level <- 2
by_x <- "manager"
next_manager <- df[,"manager"]
while (any(next_manager %in% df$employee)) {
df_new <- merge(df_new,df,by.x = by_x,by.y = "employee",suffixes = c("",level),all.x = T)
next_manager <- df_new[,paste0("manager",level)]
by_x <- paste0("manager",level)
level <- level + 1
}
> df_new
manager3 manager2 manager employee manager4
1 CEO sally sue mary <NA>
2 sally sue mary greg CEO
3 sally sue mary don CEO
4 <NA> CEO sally sue <NA>
5 <NA> CEO sally paul <NA>
6 <NA> <NA> CEO sally <NA>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。