当不同的标识不同时,按顺序更改行和列 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
中,我们可以使用melt
和dcast
:
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
目的是交换行和列,同时使列按照标识数值的顺序排列。例如,我的数据如下所示:
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
中,我们可以使用melt
和dcast
:
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