对于(2)(此处标记为step_1),您可以加入df 本身;用line_manager 和name 连接join。
对于 (1)(标记为 step_2),只需按 name 分组并旋转更长的时间。
输出(2):
library(tidyverse)
step_1 <-
df %>%
left_join(df, by = c("line_manager" = "name"), suffix = c("", "_lvl2")) %>%
replace_na(list(line_manager_lvl2 = ""))
name line_manager line_manager_lvl2
1 A1 B1 C1
2 A2 B1 C1
3 A3 B2 C1
4 B1 C1
5 B2 C1
6 A4 C1
输出(1):
step_2 <-
step_1 %>%
group_by(name) %>%
pivot_longer(-name, names_to = 'tmp', values_to = 'line_manager') %>%
select(-tmp) %>%
filter(line_manager != "")
name line_manager
<chr> <chr>
1 A1 B1
2 A1 C1
3 A2 B1
4 A2 C1
5 A3 B2
6 A3 C1
7 B1 C1
8 B2 C1
9 A4 C1
数据:
df <- read.table(text = "Name Line Manager
A1 B1
A2 B1
A3 B2
B1 C1
B2 C1
A4 C1",
sep = "\t",
header = TRUE,
stringsAsFactors = FALSE) %>%
mutate(across(everything(), str_replace, " ", "")) %>%
janitor::clean_names()
注意:我知道将 OP 的 (2)、step_1 和 (1) 称为 step_2 有点奇怪,但 step_ 索引更像是此转换中操作的逻辑顺序。