假设我具有以下数据框:
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
列底部的空值。
答案 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创建