r - 循环输出存储为列表
问题描述
我有广泛的监督数据,其中单个观察由 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”。
解决方案
这是一个修订版本,将结果存储在循环中的列表中。这将包括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
推荐阅读
- amazon-web-services - 如何防止在 AWS Step Functions 中同时运行状态机?
- javascript - 为什么 eval() 在 React Native 中不起作用?
- java - 在 Jboss EAP 7.2.0.GA 中处理 JSON 序列化
- java - 需要针对给定问题的正则表达式模式解决方案
- node.js - 如何在 WebStorm 中调试 Strapi?
- opengl - glMultiDrawArraysIndirect 并试图找到它是哪个绘图调用
- python - 如何加快cross_val_score?
- r - Waldtest (eRm) 的输出中有更多 p 值小数?
- python - 如何从请求返回的二进制数据创建图像以在 Django 应用程序中存储和使用?
- node.js - 使用 html2canvas 生成图像而不是从远程服务器导入图像