首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:重构经理-员工数据

R:重构经理-员工数据
EN

Stack Overflow用户
提问于 2019-06-09 12:15:36
回答 2查看 86关注 0票数 0

我有一个包含员工id和直接行经理id的员工信息列表。我想重新排列数据,这样它就会列出每个员工的所有级别的经理。

我想要创建一个循环来重复查找行管理器。

下面是创建示例数据集的代码。

代码语言:javascript
复制
employee_id = seq(1:10)
manager_id =c(1,1,2,3,4,2,3,1,4,5)

hr=data.frame(employee_id,manager_id)

下面是我所期望的:以employee_id 4为例

代码语言:javascript
复制
employee_id managerL1 managerL2 managerL3
4           3         2         1

我还应该指出,这是一个简化的例子。在我正在处理的真实数据中,经理和员工ids不是顺序的。它们是一些带有前缀的随机数。id本身没有任何关于管理级别的信息。该级别完全由数据驱动。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-09 16:23:36

这似乎需要一个迭代的解决方案。

从我们员工的1级经理开始。作为每个员工的经理的员工的行索引是

代码语言:javascript
复制
i <- 1
idx = match(hr$manager_id, hr$employee_id)

经理的经理是hr$manager_id[idx],我们可以迭代地使用相同的match()方法。记录并重复,直到只有一名员工担任经理

代码语言:javascript
复制
repeat {
    idx = match(hr$manager_id[idx], hr$employee_id)
    hr[[paste0("manager_", i)]] = hr$employee_id[idx]
    if (length(unique(idx)) == 1)
        break
    i <- i + 1
}

一个变体可能允许一个或多个高层管理人员使用NA作为管理器,并适当地停止。

代码语言:javascript
复制
hr$employee_id[1] = NA  # the boss; there could be several top-level managers...
i <- 1
idx = match(hr$manager_id, hr$employee_id)
repeat {
    idx = match(hr$manager_id[idx], hr$employee_id)
    hr[[paste0("manager_", i)]] = hr$employee_id[idx]
    if (all(is.na(idx)))
        break
    i <- i + 1
}
票数 2
EN

Stack Overflow用户

发布于 2019-06-09 14:52:09

下面是tidyverse的一个选项

代码语言:javascript
复制
library(tidyverse)
hr %>%  
   uncount(manager_id, .remove = FALSE)  %>% 
   group_by(employee_id) %>% 
   mutate(new_id = row_number(), nm1 = str_c('manager_', new_id)) %>% 
   spread(nm1,new_id)
# A tibble: 10 x 7
# Groups:   employee_id [10]
#   employee_id manager_id manager_1 manager_2 manager_3 manager_4 manager_5
#         <int>      <dbl>     <int>     <int>     <int>     <int>     <int>
# 1           1          1         1        NA        NA        NA        NA
# 2           2          1         1        NA        NA        NA        NA
# 3           3          2         1         2        NA        NA        NA
# 4           4          3         1         2         3        NA        NA
# 5           5          4         1         2         3         4        NA
# 6           6          2         1         2        NA        NA        NA
# 7           7          3         1         2         3        NA        NA
# 8           8          1         1        NA        NA        NA        NA
# 9           9          4         1         2         3         4        NA
#10          10          5         1         2         3         4         5

或者使用mapspread

代码语言:javascript
复制
hr %>% 
   mutate(new_id = map(manager_id, seq)) %>% 
   unnest %>%
   mutate(nm1 = str_c('manager_', new_id)) %>% 
   spread(nm1, new_id)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56514507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档