2017-11-20 18 views
0

41040 obs의 대형 데이터 프레임이 있습니다. 20 변수. 모의 데이터 세트를 간소화하여 질문을 이해하기 쉽습니다.복잡하고 큰 데이터 프레임 재구성

내가 무엇을 가지고 :

내가이에서 원하는 무엇
rm(list = ls()) 

variable <- rep(c('var1', 'var1_2', 'var1_3', 'var1_4'), 5) 
group <- as.factor(rep(c('county1', 'county2', 'county3', 'county4'), 5)) 
year <- rep(c(2000:2004), 4) 
month <- c(rep(1:12, 1), 1:8) 

value1 <- sample(1:10000, 20) 
value2 <- sample(1:10000, 20) 
value3 <- sample(1:10000, 20) 


mydata <- data.frame(variable, group, year, month, value1, value2, value3) 

head(mydata) 

    variable group year month value1 value2 value3 
1  var1 county1 2000  1 4848 4759 6029 
2 var1_2 county2 2001  2 7624 3486 6745 
3 var1_3 county3 2002  3 4612 9155 4266 
4 var1_4 county4 2003  4 1496 2420 9451 
5  var1 county1 2004  5 6739 4312 5577 
6 var1_2 county2 2000  6 5127 5030 5479 

, 값이 카운티 년 또는 몇 달에 걸쳐 엉망이되지 않습니다 다른 data.frame를 얻을 수 있지만 각 열에서 하나 개의 변수를 나타냅니다 가변 열. 같은 예에 나는이 얻을 수있는 가장 빠른 방법을 찾고 명확히하기 위해 : county1에 대한 모든 값을 후

var1 <- c(t(mydata[1, 5:7])) 
var1_2 <- c(t(mydata[2, 5:7])) 
var1_3 <- c(t(mydata[3, 5:7])) 
var1_4 <- c(t(mydata[4, 5:7])) 

group2 <- rep('county1', 3) 
year2 <- rep(2000, 3) 
month2 <- rep(1, 3) 

mydata2 <- data.frame(group2, year2, month2, var1, var1_2, var1_3, var1_4) 

head(mydata2) 

group2 year2 month2 var1 var1_2 var1_3 var1_4 
county1 2000  1 4848 7624 4612 1496 
county1 2000  1 4759 3486 9155 2420 
county1 2000  1 6029 6745 4266 9451 

을, 2000 년 및 월 1, 2000 년 나는 그것이 달이 가고 싶은, 기록 된 county1, 3 개월 등. 모든 달이 끝난 후 나는 county2로 이동하면서 county2 등으로 2001 년을 원합니다.

melt(), dcast(), stack(), unstack(), gather() and spread()으로 다양한 방법을 시도했지만 성공하지 못했습니다.

답변

0

나는 그것을 훌륭하게 만들지 않았다. 필자는 원래 data.frame을 새로운 data.frames로 나누었습니다. 처음 4 개의 변수를 선택하고 캐스팅해야하는 다음 변수를 번갈아 사용했습니다. 이처럼 님의 더 좋은 방법을보고 난 여전히하고자하지만,

cbind(base, var1_2[ , 5:14], var1_3[ , 6:14]) 

의미가 있습니다 : 나는 각 열에 대해 이런 짓을 한 후

res <- select(mydata, c(1:4, 5)) # i changed this 5 to 6, than to 7 etc. 
base <- dcast(res, group + year + month ~ variable, value.var = 'value1') 

, 나는 새, 주조 dataframe을 만들 cbind을 사용 이 작업을 하나 또는 두 줄에서 자동으로 수행하십시오.