2011-04-13 4 views
1

저는 패널 데이터 (일정 기간 동안의 개별 관측치)가있는 2 차원 data.frame을가집니다. 차원, 개체, 값과 같은 데이터가 포함 된 3 차원 배열을 만든 경우이 방법이 더 유용 할 것이라고 생각합니다.2x2 데이터 프레임에서 [R]로 인덱싱 된 다차원 배열 만들기

내 접근 방식은 기존 2x2 데이터 프레임 내에서 특정 날짜를 분리 한 다음 3 차원 배열을 얻기 위해 이들 슬라이스를 서로 쌓아 올리는 것입니다. 그러나 각 슬라이스에는 다른 수의 행이 있으므로 'abind'기능을 통해 스택을 허용하지 않습니다.

# create example data frame 
df1 = cbind(rep(8,12),c(rep(4,4),rep(3,4),2,2,1,1), 
rep(2010,12),c("John","Frank","Bill","Anne","John", 
"Frank","Bill","Anne","John","Frank","John","Frank"), 
1:12,90:79,41:52) 

df1 = data.frame(df1) 
names(df1) = c("MM","DD","YR","Individual","Value1","Value2","Value3") 

# the 'cube' function isolates a specific MM/DD/YR 'slice' 
# Later I will attempt to stack the slices to get a 3-d array. 
cube = function(MM,DD,YR) { 
df2 = df1[df1$MM == MM & df1$DD == DD & df1$YR == YR,] 
df2 
} 

# specify some parameter values 
m = 8 
d = c(1:4) 
y = 2010 

# apply 'cube' function to all date combinations specified 
# by parameters m, d, y 

out = apply(expand.grid(m,d,y),1, 
function(x,y,z) cube(x[1],x[2],x[3])) 

out = array(out) 
k = dim(expand.grid(m,d,y)) 
z = data.frame(out[1]) 

require(abind) 

# specify function that will transform 2-d data.frame into 3-d array. 
for (i in 2:k[1]){ 
p = data.frame(out[i]) 
z = abind(z,p,along = 3) 
} 

내가 루프가 실행할 때 내가 오류 메시지 :

Error in abind(z, p, along = 3) : 
    arg 'X2' has dims=4, 7, 1; but need dims=2, 7, X 

나는 CRAN 패키지를 사용하고는 'abind'.

질문 : 크기가 다른 슬라이스를 서로 쌓아 올리는 'abind'기능을 사용할 수 있습니까? 또는 원하는 배열을 만드는보다 효율적인 방법이 있습니까?

+1

을 나는 100 % 확실하지 않다 무엇을 당신은 "2x2 data.frame"을 의미합니다. 순진하게 2 행 2 열 (이 말은 당신이 의미하는 것일 수는 없다고 생각합니다.)이라고 읽습니다. 작은 재현 가능한 예제를 제공 할 수 있다면 정말 도움이 될 것입니다. –

+0

확인; 이 코드에는 재현 가능한 예제가 포함되어 있습니다. –

+0

새로운 답변이 원하는대로 할 수 있습니까? –

답변

1

완전히 다시 작성되었습니다 (예를 들어 주셔서 감사합니다). 예제 데이터를 약간 더 작게 작성했습니다. 당신은 NAS가 공간을 작성하지만, "누더기"목록을 갖고 싶어하지 않으려면

df1 <- data.frame(MM=rep(8,12),DD=c(rep(4,4),rep(3,4),2,2,1,1), 
        YR=rep(2010,12), 
        Individual=c("John","Frank","Bill","Anne","John", 
        "Frank","Bill","Anne","John","Frank","John","Frank"), 
        Value1=1:12,Value2=90:79,Value3=41:52) 
## create composite date variable 
df1 <- transform(df1,date=as.Date(paste(YR,MM,DD,sep="/"))) 
## drop date components 
df1 <- subset(df1,select=-c(MM,DD,YR)) 
library(reshape) 
m <- melt(df1,id.var=c("Individual","date")) 
cast(m,Individual~...~date) 

또는, 당신은이 작업을 수행 할 수 있습니다

lapply(split(df1,df1$date),function(x) subset(x,select=-date)) 
+0

고마워요 -이게 도움이 되긴하지만 정확히 내가 원하는 건 아닙니다. 내 대답에 재현 가능한 코드를 추가했습니다 (위). 관찰 (날짜, subj) 당 하나의 "가치"가있을 때 당신의 방법이 효과가 있다고 생각합니다. 하지만 3 차원 배열을 사용하면 관찰 당 여러 값을 처리 할 수 ​​있기를 바랍니다. –

+0

내 데이터를 처리하는 데있어 마지막 행을 캐스팅 함수의 합계로 바꾸는 것이 었습니다.'cast (m, Individual ~ ... ~ date, sum)'감사합니다. –