티스토리 뷰
spread() : Error: Each row of output must be identified by a unique combination of keys.
시간투자자 2019. 10. 22. 15:105개의 나무에 대한 수령과 둘레를 기록한 아래의 데이터에 대한 tidyr 패키지의
gather()와 spread()를 테스트하자.
Orange 데이터
-------------
> head(Orange) Grouped Data: circumference ~ age | Tree Tree age circumference 1 1 118 30 2 1 484 58 3 1 664 87 4 1 1004 115 5 1 1231 120 6 1 1372 142
------------
age와 circumference 컬럼에 대한 gather() 수행
------------
> long_Orange <- Orange %>% + gather(key=측정, value=값, -Tree) > head(long_Orange)
Tree 측정 값 1 1 age 118 2 1 age 484 3 1 age 664 4 1 age 1004 5 1 age 1231 6 1 age 1372
-----------
gather한 '측정' 필드를 다시 spread() 하면 아래와 같은 에러가 발생한다.
에러의 원인과 해결 방안은?
----------------
> long_Orange %>% spread(key=측정, value=값) Error: Each row of output must be identified by a unique combination of keys. Keys are shared for 70 rows: * 15, 16, 17, 18, 19, 20, 21 * 1, 2, 3, 4, 5, 6, 7 * 29, 30, 31, 32, 33, 34, 35 * 8, 9, 10, 11, 12, 13, 14 * 22, 23, 24, 25, 26, 27, 28 * 50, 51, 52, 53, 54, 55, 56 * 36, 37, 38, 39, 40, 41, 42 * 64, 65, 66, 67, 68, 69, 70 * 43, 44, 45, 46, 47, 48, 49 * 57, 58, 59, 60, 61, 62, 63 Do you need to create unique ID with tibble::rowid_to_column()? Call `rlang::last_error()` to see a backtrace
----------------
Answer :
spread 된 상황에서.. Tree 컬럼의 5개의 값( 1, 2, 3, 4, 5)을 갖는다.
이에 비해 spread 되는 (age, circumference) 는 각각 35개 row 를 갖게 된다.
즉, row의 갯수가 맞지 않는다.
spread()가 동작하기 위해서는 Tree 컬럼이 35개의 unique 한 값을 가질 필요가 있다.
이를 위해서 Tree 컬럼과 age 컬럼을 합한 값을 Tree 컬럼에 넣어서 Unique 하게 만들 필요가 있다.
unique 한 Tree 컬럼을 생성한 후, gather()와 spread()
-------------------
> Orange_2 <- Orange %>% mutate(Tree = paste0(Tree,"_", age)) > head(Orange_2) Tree age circumference 1 1_118 118 30 2 1_484 484 58 3 1_664 664 87 4 1_1004 1004 115 5 1_1231 1231 120 6 1_1372 1372 142 > long_Orange <- Orange_2 %>% + gather(key = 측정, value=값, -Tree) > head( long_Orange %>% spread(key = 측정, value=값) ) Tree age circumference 1 1_1004 1004 115 2 1_118 118 30 3 1_1231 1231 120 4 1_1372 1372 142 5 1_1582 1582 145 6 1_484 484 58
-------------------