通过while循环或Reduce,仅基于R的多级员工经理关系

Posted

技术标签:

【中文标题】通过while循环或Reduce,仅基于R的多级员工经理关系【英文标题】:multilevel employee manager relationship through while loop or Reduce, base R only 【发布时间】:2021-08-16 20:40:10 【问题描述】:

我的问题可以看作是 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 最受欢迎。

输入如下

df <- data.frame(manager = c("CEO","sally","sally","sue","mary", "mary"),
                          employee = c("sally","sue","paul","mary","greg", "don"),
                          stringsAsFactors = FALSE)

我尝试的是这样的。

df |>
  merge(df, by.x = 'manager', by.y = 'employee', suffixes = c('', '2'), all.x = T) |>
  merge(df, by.x = 'manager2', by.y = 'employee', suffixes = c('', '3'), all.x = T) |>
  merge(df, by.x = 'manager3', by.y = 'employee', suffixes = c('', '4'), all.x = T)

【问题讨论】:

【参考方案1】:

使用相同的合并解决方案,您可以使用终止条件来判断生成的经理稀疏向量是否有任何同时也是雇员的经理。这与发布的代码相同,但通过 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>

【讨论】:

以上是关于通过while循环或Reduce,仅基于R的多级员工经理关系的主要内容,如果未能解决你的问题,请参考以下文章

无需curson或While循环即可通过减少库存数量来获取可以交付的订单状态

使用带有递归的reduce函数从多级树中生成一个扁平的id数组?

如何仅用 reduce 和 map 每年总结一本字典?

R中的并行while循环

While 循环 - Scala

R中的for循环与while循环