2014-09-21 4 views
31

tidyr의 설명서에 따르면 수집 및 확산은 추이 적이지만 "iris"데이터를 사용한 다음 예제에서는 그럴 수는 없지만 그 이유는 분명하지 않습니다. 모든 설명은 크게 중복 식별자가있는 data.frame/tibble을 사용하여 확산

iris.df = as.data.frame(iris) 
long.iris.df = iris.df %>% gather(key = feature.measure, value = size, -Species) 
w.iris.df = long.iris.df %>% spread(key = feature.measure, value = size, -Species) 
나는 "iris.df"와 동일하게 데이터 프레임 "w.iris.df"을 기대하지만, 대신에 다음과 같은 오류가 발생

주시면 감사하겠습니다 :

"Error: Duplicate identifiers for rows (1, 2, 3, 4, 5, 6, 7, 8, 9..."

내 일반적인 질문은 이러한 종류의 데이터 집합에서 "수집"응용 프로그램을 역전시키는 방법입니다.

+29

관측치를 고유하게 식별 할 수있는 변수가 충분하지 않기 때문에 과도하지 않습니다. 'iris.df $ row <- 1 : nrow (iris.df) '와 같은 것을 추가해보십시오. – hadley

+0

대단히 고마워요! 내 오해를 완벽하게 수정합니다. –

답변

23

해들리의 개입은 놀랄만큼 완벽하지 않았습니다 ... 그러나 나는 그 이후에 문법을 망쳐 놓았습니다 ... 그래서 가치있는 것을 위해, 저는 완전히 작동하는 코드를 게시합니다. (미안하지만 위의 구문과 약간 다릅니다) :

library(tidyr) 
library(dplyr) 

wide <- 
    iris %>% 
    mutate(row = row_number()) %>% 
    gather(vars, val, -Species, -row) %>% 
    spread(vars, val) 

head(wide) 
# Species row Petal.Length Petal.Width Sepal.Length Sepal.Width 
# 1 setosa 1   1.4   0.2   5.1   3.5 
# 2 setosa 2   1.4   0.2   4.9   3.0 
# 3 setosa 3   1.3   0.2   4.7   3.2 
# 4 setosa 4   1.5   0.2   4.6   3.1 
# 5 setosa 5   1.4   0.2   5.0   3.6 
# 6 setosa 6   1.7   0.4   5.4   3.9 

head(iris) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.1   3.5   1.4   0.2 setosa 
# 2   4.9   3.0   1.4   0.2 setosa 
# 3   4.7   3.2   1.3   0.2 setosa 
# 4   4.6   3.1   1.5   0.2 setosa 
# 5   5.0   3.6   1.4   0.2 setosa 
# 6   5.4   3.9   1.7   0.4 setosa 

그들은 그냥 ... 유 기분 경우 순서를 변경해야합니다 ....

wide <- wide[,c(3, 4, 5, 6, 1)] ## Reorder and then remove "row" column 

및 수행 동일합니다.