从长到宽-将一列(使用多个度量)转换为一对列

时间:2019-04-19 20:59:08

标签: r dplyr tidyr reshape2

我一直在尝试将集群结构的长数据集重整为宽格式:在每个集群中,宽格式将有两对列,分别代表长格式度量。

以下是长格式的示例:

set.seed(20190419)
   dt1<-data.frame(
     id=sample(1:10),
     fam=c(rep(c('a','b'),each=3),rep(c('d'),each=4)),
     value=rnorm(10))

dt1  
  

id是每个人的唯一变量,fam是聚类ID(家庭ID),而value是度量。

我不希望用1行4列来表示家庭中每个成员的值,而是希望宽格式具有多行,其中2列显示成对的家庭成员值。例如,对于大小为3的族,宽格式将包括3行,指示成员1-2、1-3、2-3的值。

这是理想的宽幅格式:

wide format

1 个答案:

答案 0 :(得分:4)

您正在寻找一种自我加入的方式:

dt1 %>% left_join(dt1, by = "fam") %>%
  filter(id.x < id.y)
#    id.x fam    value.x id.y    value.y
# 1     1   a  0.1231950    2  0.1090744
# 2     1   a  0.1231950    6  0.6753560
# 3     2   a  0.1090744    6  0.6753560
# 4     5   b  1.2385780    7  0.7440739
# 5     5   b  1.2385780   10  2.4763114
# 6     7   b  0.7440739   10  2.4763114
# 7     3   d -2.3296467    8  0.1370525
# 8     3   d -2.3296467    4 -0.5790046
# 9     3   d -2.3296467    9  0.3267871
# 10    8   d  0.1370525    9  0.3267871
# 11    4   d -0.5790046    8  0.1370525
# 12    4   d -0.5790046    9  0.3267871