首页 > 解决方案 > dplyr/tidyr:传播并获取另一列的唯一值

问题描述

假设我有以下数据框:

library(tidyverse)

x <- tribble(
  ~cluster, ~sequence, ~proportion,
  1,   'A', 0.10,
  1,  'AB', 0.09,
  1,  'AC', 0.08,
  1, 'ABC', 0.06,

  2,   'D', 0.11,
  2,   'B', 0.11,
  2,  'DB', 0.09,
  2,  'DC', 0.08,
  2,  'AC', 0.07,
  2, 'ADC', 0.06,

  3,   'D', 0.12,
  3,  'BA', 0.10,
  3,  'BB', 0.04,
  3,  'BC', 0.03,
  3,  'BF', 0.03
)

我如何将其转换为:

y <- tribble(
  ~'cluster1', ~'cluster2', ~'cluster3',
    'A',   'D',  'D',
   'AB',   'B', 'BA',
   'AC',  'DB', 'BB',
  'ABC',  'DC', 'BC',
     '',  'AC', 'BF',
     '', 'ADC',   ''
)

也就是说,我需要将 的唯一值分散cluster为列,并将 的值sequence(它们已经是唯一的)clusterX按 的降序排列到每个列中proportion

注意:每个cluster都有不同数量的 unique ,导致某些列sequences底部的空值。clusterX

标签: rtidyr

解决方案


ldplyplyr之后检查split

df=plyr::ldply(split(x$sequence,x$cluster), rbind)
col=df$.id
df$.id=NULL
df=data.frame(t(df))

names(df)=paste('cluster',col)
df
  cluster 1 cluster 2 cluster 3
1         A         D         D
2        AB         B        BA
3        AC        DB        BB
4       ABC        DC        BC
5      <NA>        AC        BF
6      <NA>       ADC      <NA>

推荐阅读