一个更简单的选择是使用bind_rows 和filtered 在“名称”中具有“vec”和第二个没有这些的数据,重命名它以便它创建填充有NA 的新列
library(dplyr)
out <- z %>%
pull(Name) %>%
unique %>%
combn(., 3, FUN = function(vec)
z %>%
filter(Name %in% vec) %>%
bind_rows(z %>%
filter(!Name %in% vec) %>%
rename(Name2 = Name, Vote2 = Vote)), simplify = FALSE)
-输出
out[[1]]
# Name Vote Name2 Vote2
#1 Jhon a <NA> <NA>
#2 Lee b <NA> <NA>
#3 Suzan c <NA> <NA>
#4 Jhon f <NA> <NA>
#5 Lee g <NA> <NA>
#6 Suzan h <NA> <NA>
#7 Jhon k <NA> <NA>
#8 Lee l <NA> <NA>
#9 Suzan m <NA> <NA>
#10 Jhon p <NA> <NA>
#11 Lee q <NA> <NA>
#12 Suzan r <NA> <NA>
#13 Jhon u <NA> <NA>
#14 <NA> <NA> Abhinav d
#15 <NA> <NA> Brain e
#16 <NA> <NA> Abhinav i
#17 <NA> <NA> Brain j
#18 <NA> <NA> Abhinav n
#19 <NA> <NA> Brain o
#20 <NA> <NA> Abhinav s
#21 <NA> <NA> Brain t
另外,如果我们需要在底部有NA
out2 <- z %>%
pull(Name) %>%
unique %>%
combn(., 3, FUN = function(vec)
z %>%
filter(Name %in% vec) %>%
bind_rows(z %>%
filter(!Name %in% vec) %>%
rename(Name2 = Name, Vote2 = Vote)) %>%
mutate(across(c(Name2, Vote2),
~ .[order(is.na(.))])), simplify = FALSE)
out2[[1]]
# Name Vote Name2 Vote2
#1 Jhon a Abhinav d
#2 Lee b Brain e
#3 Suzan c Abhinav i
#4 Jhon f Brain j
#5 Lee g Abhinav n
#6 Suzan h Brain o
#7 Jhon k Abhinav s
#8 Lee l Brain t
#9 Suzan m <NA> <NA>
#10 Jhon p <NA> <NA>
#11 Lee q <NA> <NA>
#12 Suzan r <NA> <NA>
#13 Jhon u <NA> <NA>
#14 <NA> <NA> <NA> <NA>
#15 <NA> <NA> <NA> <NA>
#16 <NA> <NA> <NA> <NA>
#17 <NA> <NA> <NA> <NA>
#18 <NA> <NA> <NA> <NA>
#19 <NA> <NA> <NA> <NA>
#20 <NA> <NA> <NA> <NA>
#21 <NA> <NA> <NA> <NA>
或者也可以使用setdiff/anti_join from dplyr
out <- z %>%
pull(Name) %>%
unique %>%
combn(., 3, FUN = function(vec) {
z1 <- z %>%
filter(Name %in% vec)
z2 <- setdiff(z, z1)
names(z2) <- paste0(names(z2), 2)
bind_rows(z1, z2)
}, simplify = FALSE)