【发布时间】:2021-04-23 22:31:02
【问题描述】:
我有广泛的监督数据,其中单个观察由 1 级员工及其部门一直到 8 级组成。我使用带有其他命令的循环来生成所有员工及其下属部门的长格式列表这样我就可以看到各级员工负责哪些部门。可能有比循环更优雅的方法来做到这一点,但它工作正常。样本数据(为简洁起见,通过 3 级):
data <- tibble(LV1_Employee_Name = "Chuck", LV1_Employee_Nbr = "1", LV1_Department = "Tha Boss", LV1_Department_Nbr = "90",
LV2_Employee_Name = c("Alex", "Alex", "Paul", "Paul", "Jennifer", "Jennifer"), LV2_Employee_Nbr = c("2", "2", "3", "3", "4", "4"), LV2_Department = c("Leadership", "Leadership", "Finance", "Finance", "Philanthropy", "Philanthropy"), LV2_Department_Nbr = c("91", "91", "92", "92", "93", "93"),
LV3_Employee_Name = c("Dan", "Wendy", "Sarah", "Monique", "Miguel", "Brandon"), LV3_Employee_Nbr = c("2", "2", "3", "3", "4", "4"), LV3_Department = c("Analytics", "Pop Health", "Acounting", "Investments", "Yacht Aquisitions", "Golf Junkets"), LV3_Department_Nbr = c("94", "95", "96", "97", "98", "99"))
下面的循环首先产生六个小标题,分别命名为 level1_1、level1_2、level1_3、level2_2、level2_3、level3_3。每个 tibble 包含员工姓名、编号和同一部门级别或以下的部门。然后代码列出并使用ls() 和bind_rows() 绑定这些小标题的行,然后应用distinct() 命令,我就得到了我需要的东西。
first_department <- 1
data_colnames <- c("Employee", "Employee_Id", "Department", "Department_Number")
for(i in 1:3){
for(k in first_department:3){
assign(paste0("level", i, "_", k), setNames(distinct(as_tibble(c(data[ ,paste0("LV", i, "_", "Employee_Name")], data[ ,paste0("LV", i, "_", "Employee_Nbr")],
data[ ,paste0("LV", k, "_", "Department")], data[ ,paste0("LV", k, "_", "Department_Nbr")]))),
data_colnames))
}
first_department = first_department + 1
}
employees_departments <- distinct(bind_rows(mget(ls(pattern = "^level")))) %>%
filter(is.na(Department) == FALSE)
rm(list = ls(pattern = "^level"))
我想做的是,让循环本身输出列表,而不是产生六个小标题的初始输出。这将使我免于在输出中出现大量 tibbles,据我所知,这些 tibbles 不是很“R-like”。
【问题讨论】: