我有一个包含员工id和直接行经理id的员工信息列表。我想重新排列数据,这样它就会列出每个员工的所有级别的经理。
我想要创建一个循环来重复查找行管理器。
下面是创建示例数据集的代码。
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为例
employee_id managerL1 managerL2 managerL3
4 3 2 1我还应该指出,这是一个简化的例子。在我正在处理的真实数据中,经理和员工ids不是顺序的。它们是一些带有前缀的随机数。id本身没有任何关于管理级别的信息。该级别完全由数据驱动。
发布于 2019-06-09 16:23:36
这似乎需要一个迭代的解决方案。
从我们员工的1级经理开始。作为每个员工的经理的员工的行索引是
i <- 1
idx = match(hr$manager_id, hr$employee_id)经理的经理是hr$manager_id[idx],我们可以迭代地使用相同的match()方法。记录并重复,直到只有一名员工担任经理
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作为管理器,并适当地停止。
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
}发布于 2019-06-09 14:52:09
下面是tidyverse的一个选项
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或者使用map和spread
hr %>%
mutate(new_id = map(manager_id, seq)) %>%
unnest %>%
mutate(nm1 = str_c('manager_', new_id)) %>%
spread(nm1, new_id)https://stackoverflow.com/questions/56514507
复制相似问题