tidyr::spread报错: unique combination of keys
测试开头

测试结尾
今天是生信星球陪你的第493天
大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~
就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~
这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!
花花写于2019.11.27
豆豆失踪,只学shiny不记录。给豆豆差评。
关于gather和spread这一对函数,查看:
写给零基础同学的R语言教程第三篇-神奇R包tidyr
理论上他俩是无缝可逆的。但有的数据spread却会报错,如题。这是因为缺少唯一索引,导致spread迷路。直接谷歌搜索就会发现,这个问题得到了哈德雷大佬亲自解答。
https://github.com/tidyverse/tidyr/issues/426

来debug啦!!!
0.准备数据和包
我们使用内置数据集iris。因为他有报错潜质,他的每个样本也就是每一行,没有唯一id(行名不算的)。
if(!require(tidyr))install.packages("tidyr")
if(!require(dplyr))install.packages("dplyr")
library(tidyr)
library(dplyr)
test = iris
1.gather没有问题
test2 <- gather(
data = test[,1:4],
key = dd,
value = pp
)
2.但spread会报错
spread(
data = test2,
key = dd,
value = pp
)
#> Error: Each row of output must be identified by a unique combination of keys.
#> Keys are shared for 600 rows:
#> * 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450
4.解决方案
group_by和mutate连用,加上一列编号作为索引即可
test2 %>%
group_by(dd) %>%
mutate(id=1:n()) %>%
spread(dd,pp)
#> # A tibble: 150 x 5
#> id Petal.Length Petal.Width Sepal.Length Sepal.Width
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1.4 0.2 5.1 3.5
#> 2 2 1.4 0.2 4.9 3
#> 3 3 1.3 0.2 4.7 3.2
#> 4 4 1.5 0.2 4.6 3.1
#> 5 5 1.4 0.2 5 3.6
#> 6 6 1.7 0.4 5.4 3.9
#> 7 7 1.4 0.3 4.6 3.4
#> 8 8 1.5 0.2 5 3.4
#> 9 9 1.4 0.2 4.4 2.9
#> 10 10 1.5 0.1 4.9 3.1
#> # ... with 140 more rows
耶。如果没有spread,可能麻烦大咯。
插个小广告!
再给生信技能树打个call!
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!