繁体   English   中英

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

[英]dplyr/tidyr: Spread and Get Unique Values of Another Column

假设我有以下数据框:

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的唯一值作为列clusterX ,并按proportion降序将sequence的值(已经是唯一的)获取到每个clusterX列中。

注意:每个cluster将具有不同数量的唯一sequences ,从而导致某些clusterX列底部的值为空。

split后与ldplyplyr检查

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>

您可以使用几个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软件包 (v0.2.1)创建于2019-03-09

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM