2017-05-12 16 views
1

긴 데이터 프레임을 넓고 플래그가있는 경우로 변환하려고합니다. 나는 그것을 피벗시키고 깃발 역할을하는 임시 벡터를 사용한다. 예를 (복사하여 Rstudio에 붙여 넣기)를 참조하지만 실제 데이터에 그것을 수행하려고 할 때 오류보고 : 그것은 작은 데이터 세트에 완벽하게 작동spread()를 사용하여 데이터 프레임을 변형하는 동안 오류를 해결하는 방법

churnTrain3 <- spread(churnTrain, key = "state", value = "temporary", fill = 0) Error: Duplicate identifiers for rows (169, 249), (57, 109), (11, 226)

구조 전체 데이터 세트에 대한 관련을 추가 처리 이 문제에 대한 해결 방법이 있습니까? 많은 사람들이 데이터를 정리하고 같은 문제에 빠지게 될 것입니다. 다음은 나에게 도움 코드입니다하십시오 먼저 덩어리 "예"가 둘째 덩어리 "실제 데이터"를보고 supiosed 이탈 라이브러리에서 데이터 세트의 일부를 분리하는 방법을 잘 시각화를 위해 설정 한 작은 데이터를 수는

library(caret) 
library(tidyr) 

#example 
#============ 
df <- data.frame(var1 = (1:6), 
      var2 = (7:12), 
      factors = c("facto1", "facto2", "facto3", "facto3","facto5", "facto1") , 
      flags = c(1, 1, 1, 1, 1, 1)) 
df 

df2 <- spread(data = df, key = "factors" , value = flags, fill = " ") 
df2 
#============= 

# real data 
#============ 
data(churn) 

str(churnTrain) 
churnTrain <- churnTrain[1:250,1:4] 
churnTrain$temporary <-1 
churnTrain3 <- spread(churnTrain, key = "state", value = "temporary", fill = 0) 

str(churnTrain) 
head(churnTrain3) 
str(churnTrain3) 
#============ 
+1

키가 고유합니까? 큰 데이터 세트의 키에 중복 된 키가있는 것 같습니다. – akaDrHouse

+0

여기에있는 데이터가 잘 작동하는 경우 데이터 구조가 일부 표시되지만 테스팅을 위해 우리에게주는 이상적인 예는 아닙니다. 아마도 문제를 일으킬 수있는 공통점을보기 위해 표시된 행을 살펴 봐야 할 것입니다. – r2evans

+0

키 중복 문제를 해결하는 방법은 무엇입니까? 솔직히 나는 그것을 해결하는 방법을 모른다. 방금 dbox()를 사용하여 ** reshape2 **로 해결하려고 시도했습니다. 여기에는 400에서 122까지의 착용 및 관찰 결과가 표시됩니다. –

답변

0

스프레드는 펼친 '키'와 나머지 데이터 (체널의 예 : account_length, area_code 및 international_plan)와 교차하는 '셀'에 하나의 고유 한 값만 넣을 수 있습니다. 따라서 실제 질문은 이러한 중복 된 항목을 관리하는 방법입니다. 그 대답은 당신이하려는 일에 달려 있습니다. 아래에 가능한 솔루션을 제공합니다. 더미 임시 변수 대신에 에피소드의 수를 세어 더미 변수로 사용합니다. 이것은 dplyr로 매우 쉽게 할 수 있습니다 :

library(tidyr) 
library(dplyr)  
library(C50) # this is one source for the churn data 

data(churn) 

churnTrain <- churnTrain[1:250,1:4] 

churnTrain2 <- churnTrain %>% 
    group_by(state, account_length, area_code, international_plan) %>% 
    tally %>% 
    dplyr::rename(temporary = n) 

churnTrain3 <- spread(churnTrain2, key = "state", value = "temporary", fill = 0) 

스프레드 이제 작동합니다.

+0

감사합니다. 매력과 같습니다. –

0

다른 사람들이 지적했듯이 spread에 고유 한 벡터를 입력해야합니다. 당신이 f 기능 내부에 대한 루프 및 기타 임시 변수를 볼 수 있지만

library(C50) 

f<- function(df, key){ 
    if (sum(names(df)==key)==0) stop("No such key"); 
    u <- unique(df[[key]]) 
    id <- matrix(0,dim(df)[1],length(u)) 
    uu <- lapply(df[[key]],function(x)which(u==x)) ## check 43697442 for details 
    for(i in 1:dim(df)[1]) id[i,uu[[i]]] <- 1 
    colnames(id) = as.character(u) 
    return(cbind(df,id)); 

} 

df <- data.frame(var1 = (1:6), 
       var2 = (7:12), 
       factors = c("facto1", "facto2", "facto3", "facto3","facto5", "facto1")) 
f(df, key='fact') 
f(df, key='factors') 

data(churn) 
churnTrain <- churnTrain[1:250,1:4] 
f(churnTrain, key='state') 

는 속도가 실제로 둔화되지 않습니다 내 솔루션은 사용 기본 R입니다.

+0

감사합니다. 아름답게 작동합니다. –