首页 > 解决方案 > 循环输出存储为列表

问题描述

我有广泛的监督数据,其中单个观察由 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 包含员工姓名、编号和同一部门级别或以下的部门。然后代码列出并用 and 绑定这些小标题的行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”。

标签: rlistloops

解决方案


这是一个修订版本,将结果存储在循环中的列表中。这将包括idx每次通过循环递增的索引。之后,您可以使用bind_rows此列表来获得完整的结果。

library(tidyverse)

idx <- 1
first_department <- 1
data_colnames <- c("Employee", "Employee_Id", "Department", "Department_Number")
data_lst <- list()

for(i in 1:3){
  for(k in first_department:3){
    data_lst[[idx]] <- 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)
    idx <- idx + 1
  }
  first_department = first_department + 1
}

distinct(bind_rows(data_lst)) %>%
  filter(!is.na(Department))

输出

   Employee Employee_Id Department        Department_Number
   <chr>    <chr>       <chr>             <chr>            
 1 Chuck    1           Tha Boss          90               
 2 Chuck    1           Leadership        91               
 3 Chuck    1           Finance           92               
 4 Chuck    1           Philanthropy      93               
 5 Chuck    1           Analytics         94               
 6 Chuck    1           Pop Health        95               
 7 Chuck    1           Acounting         96               
 8 Chuck    1           Investments       97               
 9 Chuck    1           Yacht Aquisitions 98               
10 Chuck    1           Golf Junkets      99               
11 Alex     2           Leadership        91               
12 Paul     3           Finance           92               
13 Jennifer 4           Philanthropy      93               
14 Alex     2           Analytics         94               
15 Alex     2           Pop Health        95               
16 Paul     3           Acounting         96               
17 Paul     3           Investments       97               
18 Jennifer 4           Yacht Aquisitions 98               
19 Jennifer 4           Golf Junkets      99               
20 Dan      2           Analytics         94               
21 Wendy    2           Pop Health        95               
22 Sarah    3           Acounting         96               
23 Monique  3           Investments       97               
24 Miguel   4           Yacht Aquisitions 98               
25 Brandon  4           Golf Junkets      99 

推荐阅读