数据结构:基于观察的行到基于 dyad 成员的行

Data structure: Observation-based rows to dyad member-based rows

比如现在的数据结构(根据实际观察)是这样的:

structure(list(dyad_id = c(2, 2, 3), partner1_id = c(567, 478, 
444), partner2_id = c(478, 567, 333), partner1_personality = c(5, 
3, 4), partner2_personality = c(3, 5, 2)), class = "data.frame", row.names = c(NA, 
-3L), variable.labels = structure(character(0), .Names = character(0)), codepage = 65001L)

视觉上看起来像:

╔═════════╦═════════════╦═════════════╦══════════════════════╦══════════════════════╗
║ dyad_id ║ partner1_id ║ partner2_id ║ partner1_personality ║ partner2_personality ║
╠═════════╬═════════════╬═════════════╬══════════════════════╬══════════════════════╣
║    2    ║     567     ║     478     ║           5          ║           3          ║
╠═════════╬═════════════╬═════════════╬══════════════════════╬══════════════════════╣
║    2    ║     478     ║     567     ║           3          ║           5          ║
╠═════════╬═════════════╬═════════════╬══════════════════════╬══════════════════════╣
║    3    ║     444     ║     333     ║           4          ║           2          ║
╚═════════╩═════════════╩═════════════╩══════════════════════╩══════════════════════╝

的目标是将其转换成基于成员的(即每个二元体[2行] =23=]):

╔═════════╦════════════╦═════════════════════╗
║ dyad_id ║ partner_id ║ partner_personality ║
╠═════════╬════════════╬═════════════════════╣
║    2    ║     567    ║          5          ║
╠═════════╬════════════╬═════════════════════╣
║    2    ║     478    ║          3          ║
╠═════════╬════════════╬═════════════════════╣
║    3    ║     444    ║          4          ║
╠═════════╬════════════╬═════════════════════╣
║    3    ║     333    ║          2          ║
╚═════════╩════════════╩═════════════════════╝

我们可以使用pivot_longer

library(dplyr)
library(tidyr)
library(stringr)

df1 %>% 
    pivot_longer(cols = -dyad_id, names_to = c('grp', ".value"), 
          names_sep = "_") %>%
    select(-grp) %>%
    distinct %>%
    rename_at(vars(-dyad_id), ~ str_c('partner_', .))

-输出

# A tibble: 4 x 3
#  dyad_id partner_id partner_personality
#    <dbl>      <dbl>               <dbl>
#1       2        567                   5
#2       2        478                   3
#3       3        444                   4
#4       3        333                   2