2014-07-24 6 views
53

나는 다음과 같은 더미 데이터가 :dcast와 비슷한 tidyr의 여러 열에 스프레드를 사용할 수 있습니까?

library(dplyr) 
library(tidyr) 
library(reshape2) 
dt <- expand.grid(Year = 1990:2014, Product=LETTERS[1:8], Country = paste0(LETTERS, "I")) %>% select(Product, Country, Year) 
dt$value <- rnorm(nrow(dt)) 

내가 두 제품 국가 조합

sdt <- dt %>% filter((Product == "A" & Country == "AI") | (Product == "B" & Country =="EI")) 

을 선택하고 나는 각 조합에 대한 나란히 값 측면을보고 싶어요. 나는 dcast으로이 작업을 수행 할 수 있습니다

sdt %>% dcast(Year ~ Product + Country) 

는 패키지 tidyr 에서 spread이 작업을 수행 할 수 있습니까?

답변

53

하나의 옵션은, paste하여 '제품'과 '나라'열을 결합하여 새로운 'Prod_Count'을 만들 select와 그 열을 제거하고 tidyr에서 spread를 사용하여 '전체'에서 '긴'에서 재 형성하는 것입니다.

library(dplyr) 
library(tidyr) 
sdt %>% 
mutate(Prod_Count=paste(Product, Country, sep="_")) %>% 
select(-Product, -Country)%>% 
spread(Prod_Count, value)%>% 
head(2) 
# Year  A_AI  B_EI 
#1 1990 0.7878674 0.2486044 
#2 1991 0.2343285 -1.1694878 

아니면 unitetidyr에서 (비트 뿌리의 코멘트 @에서)를 사용하여 몇 가지 단계를 방지하고 이전과 같이 바꿀 수 있습니다.

sdt%>% 
unite(Prod_Count, Product,Country) %>% 
spread(Prod_Count, value)%>% 
head(2) 
# Year  A_AI  B_EI 
# 1 1990 0.7878674 0.2486044 
# 2 1991 0.2343285 -1.1694878 
+1

네, 이것이 내 마음에 처음으로 나온 것입니다. 하지만 그것은 예쁘지 않다 :) – mpiktas

+0

@mpiktas. 나는이 방법에 대해서만 생각할 수있다. 다른 사람이 콤팩트 코드를 만들 수 있습니다.) - – akrun

+9

잘'unite()'가 있지만 숫자 데이터로만 작동합니다 (?). – beetroot