【问题标题】:long to wide - converting one column (with multiple measures) into a pair of columns长到宽 - 将一列(具有多个度量)转换为一对列
【发布时间】:2019-09-10 01:49:38
【问题描述】:

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

这是一个长格式的例子:

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(family id),value是度量。

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

这是理想的宽幅格式:

wide format

【问题讨论】:

    标签: r dplyr tidyr reshape2


    【解决方案1】:

    您正在寻找自加入:

    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
    

    【讨论】:

    • @akrun 如果有很多小的fams,则更有可能被更大的数据炸毁。我更喜欢这个,因为至少我们可以在过滤之前限制by = "fam"
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多