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

通过while循环或Reduce建立多级员工-经理关系,仅基于R,r,while-loop,reduce,R,While Loop,Reduce,我的问题可以看作是已经解决的问题的延伸 复制一下,我在办公室里有多层次的员工-经理关系,比如说,类似这样的关系 manager employee 1 CEO sally 2 sally sue 3 sally paul 4 sue mary 5 mary greg 6 mary don 我必须根据baseR中可用的方法/函数来解决这个问题。我试着将数据与自身合并(3次),以获得我期望的结果- mana

我的问题可以看作是已经解决的问题的延伸

复制一下,我在办公室里有多层次的员工-经理关系,比如说,类似这样的关系

  manager employee
1     CEO    sally
2   sally      sue
3   sally     paul
4     sue     mary
5    mary     greg
6    mary      don
我必须根据baseR中可用的方法/函数来解决这个问题。我试着将数据与自身合并(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
我试过的是这样的

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)

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