dplyr / tidyr:传播并获取另一列的唯一值

时间:2019-03-09 23:59:04

标签: r 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将具有不同数量的唯一sequences,从而导致某些clusterX列底部的空值。

2 个答案:

答案 0 :(得分:3)

ldply之后从plyr中的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>

答案 1 :(得分:1)

您可以使用几个tidyr / dplyr步骤。按比例排序数据。然后在每个群集中,添加行号以保留此顺序并满足spread的唯一标识符要求。掉落比例;传播;并删除行号。

library(dplyr)
library(tidyr)

x %>%
  arrange(-proportion) %>%
  group_by(cluster) %>%
  mutate(row = row_number()) %>%
  select(-proportion) %>%
  spread(key = cluster, value = sequence, sep = "") %>%
  select(-row)
#> # A tibble: 6 x 3
#>   cluster1 cluster2 cluster3
#>   <chr>    <chr>    <chr>   
#> 1 A        D        D       
#> 2 AB       B        BA      
#> 3 AC       DB       BB      
#> 4 ABC      DC       BC      
#> 5 <NA>     AC       BF      
#> 6 <NA>     ADC      <NA>

reprex package(v0.2.1)于2019-03-09创建