2016-10-27 2 views
0

데이터 형식이 긴 데이터 형식을 가지고 있으며 와이드 형식으로 변환하려고합니다. 데이터 프레임에는 고유 한 인스턴스로 취급하고 넓은 데이터 프레임의 개별 행으로 나타내는 여러 개의 반복 식별자가 있습니다.긴 형식에서 긴 형식으로 캐스팅 (각 반복마다 새 행 작성)

Forcing unique values before casting (pivoting) in R

그러나 위의 문제의 유일한 항목은 개별 열을 끝낼 :

내 질문은 이것과 유사하다. 내 질문에, 나는 데이터를 개별 행에 넣고 싶습니다. 예를 들면 : 나는 다양한 형식으로 내 데이터를 캐스팅 한 후

ID1<-c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C") 

ID2<-c("R","R","R","L","L","R","R","L","L","R","R","L","L","R","R") 

Sp<-c("Bird","Cat","Bird","Bird","Dog","Dog","Dog","Cat","Cat","Bird","Cat","Dog","Bird","Bird","Cat") 

Count<-c(1,2,2,1,2,1,2,3,2,1,2,3,2,1,5) 

DF<-data.frame(ID1,ID2,Sp,Count) 

는,이처럼 보이도록 출력 데이터를 싶습니다

ID1 ID2 Bird Cat Dog 
A  R  1  2 0 
A  R  2  0 0 # 2 Birds in the A/ R combination so need second row (don't want to add them together) 
A  L  1  0 2 
B  R  1  0 1 
B  R  0  0 2 
B  L  0  3 0 
B  L  0  2 0 
C  R  1  2 0 
C  R  0  5 0 
C  L  2  0 3 

을 고유 ID1/ID2 조합에는 반복이없는 경우 , 캐스팅 우월은 정상적으로 작동합니다. 그러나 반복이 있으면 두 번째 (또는 세 번째 또는 네 번째) 행이 만들어집니다.

당신은 ID1, ID2Sp의 그룹 당 보조 ID 열을 만든 다음 ID 열로 ID1, ID2AUXID로 바꿀 수

답변

1

:

library(dplyr) 
DF = DF %>% group_by(ID1, ID2, Sp) %>% mutate(AUXID = row_number()) %>% as.data.frame() 
reshape(DF, idvar = c("ID1", "ID2", "AUXID"), timevar = "Sp", dir = "wide") 

# ID1 ID2 AUXID Count.Bird Count.Cat Count.Dog 
# 1 A R  1   1   2  NA 
# 3 A R  2   2  NA  NA 
# 4 A L  1   1  NA   2 
# 6 B R  1   1  NA   1 
# 7 B R  2   NA  NA   2 
# 8 B L  1   NA   3  NA 
# 9 B L  2   NA   2  NA 
# 11 C R  1   1   2  NA 
# 12 C L  1   2  NA   3 
# 15 C R  2   NA   5  NA 

당신은 AUXID 열을 삭제하고 나중에 NA을 채울 수 있습니다 . 여기

은 NA 값을 채우기 위해 fill 매개 변수를 제공 dcast()와 data.table 버전 : 대신 기본에, 당신의`dplyr` 방법

library(data.table) 
(dcast(setDT(DF)[, AUXID := 1:.N, .(ID1, ID2, Sp)], 
     ID1 + ID2 + AUXID ~ Sp, value.var = "Count", fill = 0) 
     [, AUXID := NULL][]) 
# ID1 ID2 Bird Cat Dog 
# 1: A L 1 0 2 
# 2: A R 1 2 0 
# 3: A R 2 0 0 
# 4: B L 0 3 0 
# 5: B L 0 2 0 
# 6: B R 1 0 1 
# 7: B R 0 0 2 
# 8: C L 2 0 3 
# 9: C R 1 2 0 
#10: C R 0 5 0 
+2

을'reshape' 당신의 마지막에이를 추가 할 수 있습니다 dplyr ('reshape2'로드 후) dplyr chain : dcast (ID1 + ID2 + AUXID ~ Sp, value.var = "Count", fill = 0) %> % select (-AUXID)' – eipi10