使用下面的for循环,我可以创建一个给定员工之上的所有经理的列表(本质上是一个员工的经理、她的经理的经理等的列表)。
library(dplyr)
library(tidyr)
library(purrr)
# Create test data
ds <-
tibble(
emp_id = c("001", "002", "003", "004", "005"),
mgr_id = c("002", "004", "004", "005", NA)
)
# Hardcoded for-loop example
mgr_ids_above <- vector("list", length = 5)
id <- "001"
for (i in seq_along(mgr_ids_above)) {
mgr_ids_above[[i]] <- ds$mgr_id[ds$emp_id == id]
id <- mgr_ids_above[[i]]
}
# drop NAs
mgr_ids_above <- unlist(mgr_ids_above)
mgr_ids_above <- mgr_ids_above[!is.na(mgr_ids_above)]
# return to list format
as.list(mgr_ids_above)
我希望将这个for循环应用于整个数据帧,并将结果保存在一个列表列中。我可以使用pmap()
成功地将硬编码的for循环应用到我的数据帧中,但是当我试图编写一个泛化函数时,一切都会崩溃。
# Define custom function with hardcoded data and variable names
get_mgrs_above <- function(id, max_steps = 5){
mgr_ids_above <- vector("list", length = max_steps)
for (i in seq_along(mgr_ids_above)) {
mgr_ids_above[[i]] <- ds$mgr_id[ds$emp_id == id]
id <- mgr_ids_above[[i]]
}
# drop NAs
mgr_ids_above <- unlist(mgr_ids_above)
mgr_ids_above <- mgr_ids_above[!is.na(mgr_ids_above)]
# return to list format
as.list(mgr_ids_above)
}
# Apply custom function
ds_mgrs_above <-
ds %>%
mutate(
ranks_above = pmap(
list(id = emp_id),
get_mgrs_above
)
)
上述代码的输出为
A tibble: 5 x 3
emp_id mgr_id ranks_above
<chr> <chr> <list>
1 001 002 <list [3]>
2 002 004 <list [2]>
3 003 004 <list [2]>
4 004 005 <list [1]>
5 005 NA <list [0]>
ranks_above
列表列的内容如下所示
ds_mgrs_above$ranks_above[[1]]
[[1]]
[1] "002"
[[2]]
[1] "004"
[[3]]
[1] "005"
我将所有数据和变量作为参数提供的失败函数失败,并显示消息"Error in mutate_impl(.data,dots):Evaluation error: Element 1 has length 2,not 1 or 5..":
get_mgrs_above <- function(
data,
id = emp_id,
mgr_id = mgr_id,
emp_id = emp_id,
max_steps = 5){
mgr_ids_above <- vector("list", length = max_steps)
for (i in seq_along(mgr_ids_above)) {
mgr_ids_above[[i]] <- data$mgr_id[data$emp_id == id]
id <- mgr_ids_above[[i]]
}
# drop NAs
mgr_ids_above <- unlist(mgr_ids_above)
mgr_ids_above <- mgr_ids_above[!is.na(mgr_ids_above)]
# return to list format
as.list(mgr_ids_above)
}
ds %>%
mutate(
ranks_above = pmap(
list(
data = ds,
id = emp_id,
mgr_id = mgr_id,
emp_id = emp_id,
max_steps = 5
),
get_mgrs_above
)
)
为了避免混淆,这是一篇关于如何编写一个泛化函数的文章,该函数将从两个列创建一个列表列。这是在拥有大约15k名员工的数据帧上进行更大规模的数据交换尝试的一个组成部分。
https://stackoverflow.com/questions/51976112
复制相似问题