当不同的标识不同时,按顺序更改行和列 pairs/dyads

Changing rows and columns by order when the identifications are different for different pairs/dyads

目的是交换行和列,同时使列按照标识数值的顺序排列。例如,我的数据如下所示:

structure(list(pair_id = structure(c(1L, 1L), .Label = "12_34   ", class = "factor"), 
    member_id = c(34, 12), trait1 = c(5, 2), trait2 = c(3, 3)), class = "data.frame", row.names = c(NA, 
-2L), variable.labels = structure(character(0), .Names = character(0)), codepage = 65001L)

在视觉上,上面看起来像:

╔═════════╦═══════════╦════════╦════════╗
║ pair_id ║ member_id ║ trait1 ║ trait2 ║
╠═════════╬═══════════╬════════╬════════╣
║  12_34  ║     34    ║    5   ║    3   ║
╠═════════╬═══════════╬════════╬════════╣
║  12_34  ║     12    ║    2   ║    3   ║
╚═════════╩═══════════╩════════╩════════╝

在交换 'member_id' 和 'trait1-trait2' 时,我正在寻找一种方法来确保特征也按顺序构建。也就是说,预期的最终结果将是:

╔═════════╦════════╦═════════╦═════════╗
║ pair_id ║ trait  ║ member1 ║ member2 ║
╠═════════╬════════╬═════════╬═════════╣
║  12_34  ║ trait1 ║    5    ║    2    ║
╠═════════╬════════╬═════════╬═════════╣
║  12_34  ║ trait2 ║    3    ║    3    ║
╚═════════╩════════╩═════════╩═════════╝

对于这个特定示例,您不需要 group_by(),但是一旦您拥有多个 pair_id,我假设您的数据集将具有。

df <- structure(list(pair_id = structure(c(1L, 1L), .Label = "12_34   ", class = "factor"), 
               member_id = c(34, 12), trait1 = c(5, 2), trait2 = c(3, 3)), class = "data.frame",
               row.names = c(NA, -2L), 
               variable.labels = structure(character(0), .Names = character(0)), codepage = 65001L)

df %>%
  arrange(member_id) %>%
  group_by(pair_id) %>%
  mutate(member_id = paste0("member",row_number())) %>%
  ungroup() %>%
  gather(trait, value,-c(1:2)) %>%
  spread(member_id, value)

data.table中,我们可以使用meltdcast

library(data.table)

dcast(melt(setDT(df), measure.vars = c('trait1', 'trait2')), 
     pair_id + variable ~ paste0('member', rowid(variable)), value.var = 'value')

#    pair_id variable member1 member2
#1: 12_34      trait1       5       2
#2: 12_34      trait2       3       3