2010-06-22 2 views
2

저는 Compustat의 큰 패널을 가지고 있습니다. 그것에 나는 손으로 수집 한 데이터를 추가하고있다. (오래된 책 더미에서 직접 손으로 수집했다.) 그러나 전체 패널에 대해 무작위로 선택한 하위 집합 만 수작업으로 수집하고 싶지는 않습니다. 더 큰 세트 (무작위로 선택하는)를 찾으려면 Compustat의 균형 패널부터 시작하고 싶습니다.R에서 균형 잡힌 패널 데이터를 찾는 방법 (특정 창에서 패널의 항목을 찾는 방법)

나는 불균형 패널 작업을위한 plm 라이브러리를보고 있지만 균형을 유지하고 싶습니다. 샘플 기간을 운영하지 않는 회사 (패널 피크에있는 개인)를 찾아 내고 버리기에 부족한이 일을 할 수있는 깨끗한 방법이 있습니까? 감사!

답변

1

다시 생각해 보면 훨씬 쉬운 방법이 있습니다. 이것

봐 :

data.with.only.complete.subjects.data <- function(xx, subject.column, number.of.observation.a.subject.should.have) 
{ 
    subjects <- xx[,subject.column] 
    num.of.observations.per.subject <- table(subjects) 
    subjects.to.keep <- names(num.of.observations.per.subject)[num.of.observations.per.subject == number.of.observation.a.subject.should.have] 

    subset.by.me <- subjects %in% subjects.to.keep 

    new.xx <- xx[subset.by.me ,] 

    return(new.xx) 
} 

xx <- data.frame(subject = rep(1:4, each = 3), 
      observation.per.subject = rep(rep(1:3), 4)) 
xx.mis <- xx[-c(2,5),] 

data.with.only.complete.subjects.data(xx.mis , 1, 3) 
+0

고마워, 탈! '% in %'연산자는 지식이 부족합니다! 나는 사고로 그것을 우연히 발견했다. (내 완고한 해결책을 받아 들인 후). 필자는 독립적 인 기능을 독자적으로 생각해 냈습니다. FWIW, 나는 아래에 게시 할 것이다. –

0

업데이트 :이 솔루션은 다음 내가 위에서 게시 다른 하나 덜 좋은 생각,하지만 난 솔루션의 예로 떠납니다 - *

안녕 Rishard : 너무 좋지 않다,

일부 샘플 데이터가 도움이되는 데 약간 어려움이 있습니다.

"변형 된"패키지에서 "용해"및 "캐스트"를 사용하여 데이터를 다시 만들 수있는 것처럼 들립니다. 그렇게하면 주제 당 관찰력이 너무 적은 부분을 찾은 다음 해당 정보를 사용하여 데이터를 부분 집합화할 수 있습니다. 여기

는이 작업을 수행 할 수있는 방법의 예 코드 :

xx <- data.frame(subject = rep(1:4, each = 3), 
      observation.per.subject = rep(rep(1:3), 4)) 
xx.mis <- xx[-c(2,5),] 

require(reshape) 


num.of.obs.per.subject <- cast(xx.mis, subject ~.) 
the.number <- num.of.obs.per.subject[,2] 
subjects.to.keep <- num.of.obs.per.subject[,1] [the.number == 3] 

ss.index.of.who.to.keep <- xx.mis $subject %in% subjects.to.keep 

xx.to.work.with <- xx.mis[ss.index.of.who.to.keep ,] 


xx.to.work.with 

건배,

+0

감사, 탈! 나는 '모양새'에 대해 들어 본 적이 없지만, 내가 원하는대로 정확하게 할 수는 없으므로, 나는 내 자신의 코드 중 일부를 썼다. –

0

지금 보면, 나는 데이터의 일부에 서식을 잃었지만, 나는 나중에 그것을 이해할 수있다. 패널의 균형 부분을 잡으려는 나의 시도는 다음과 같습니다.

> data <- read.csv("223601533.csv") 
> head(data) 
    gvkey indfmt datafmt consol popsrc fyear fyr datadate exchg   isin 
1 2721 INDL HIST_STD  C  I 2000 12 200JP3242800005 
2 2721 INDL HIST_STD  C  I 2001 12 20011231 264 JP3242800005 
3 2721 INDL HIST_STD  C  I 2002 12 20021231 264 JP3242800005 
4 2721 INDL HIST_STD  C  I 2003 12 20031231 264 JP3242800005 
5 2721 INDL HIST_STD  C  I 2004 12 20041231 264 JP3242800005 
6 2721 INDL HIST_STD  C  I 2005 12 20051231 264 JP3242800005 
    sedol  conm costat fic 
1 6172323 CANON INC  A JPN 
2 6172323 CANON INC  A JPN 
3 6172323 CANON INC  A JPN 
4 6172323 CANON INC  A JPN 
5 6172323 CANON INC  A JPN 
6 6172323 CANON INC  A JPN 
> 
> obs.all <- tabulate(data$gvkey) # incl lots of zeros for unused gvkey 
> num.obs <- tabulate(obs.all) 
> mode.num.obs <- which(num.obs == max(num.obs)) 
> nt.bal <- num.obs[mode.num.obs] * mode.num.obs 
> pot.obs <- which(obs.all == mode.num.obs) 
> data.bal <- as.data.frame(matrix(NA, nrow=nt.bal, ncol=ncol(data))) 
> colnames(data.bal) <- colnames(data) 
> 
> for(i in 1:length(pot.obs)) { 
+ last.row <- i * mode.num.obs 
+ first.row <- last.row - (mode.num.obs - 1) 
+ data.bal[first.row:last.row, ] <- subset(data, gvkey == pot.obs[i]) 
+ } 
> 
> head(data.bal) 
    gvkey indfmt datafmt consol popsrc fyear fyr datadate exchg isin sedol conm 
1 2721  2  1  1  1 2000 12 200
2 2721  2  1  1  1 2001 12 20011231 264 875 359 331 
3 2721  2  1  1  1 2002 12 20021231 264 875 359 331 
4 2721  2  1  1  1 2003 12 20031231 264 875 359 331 
5 2721  2  1  1  1 2004 12 20041231 264 875 359 331 
6 2721  2  1  1  1 2005 12 20051231 264 875 359 331 
    costat fic 
1  1 1 
2  1 1 
3  1 1 
4  1 1 
5  1 1 
6  1 1 
> 
+0

안녕 리 카드, "dput"명령을 사용하여 데이터 게시를 시도하십시오. 건배, 탈 –

+0

데이터 세트가 꽤 큽니다. 나는이 창문들이 가져갈 것이라고 생각하지 않는다. 멋진 계량 경제학 용어를 제쳐두고 추측합니다. 큰 데이터 프레임을 가져 와서 정확하게 M 번 (즉, 정확하게 10 개의 관측치가없는 회사) 인 N 열에 항목이없는 모든 행을 제거하고 싶습니다. . –

+0

안녕하세요 리차드 -이 일을 내 대답 코드에 추가했습니다. 베스트, 탈. –

0
> # read data 
> file.in <- "243815928.csv" 
> data <- read.csv(file.in) 
> 
> # find which gvkeys run the entire sample period 
> obs.all <- tabulate(data$gvkey) # incl lots of zeros for unused gvkey 
> num.obs <- tabulate(obs.all) 
> mode.num.obs <- which(num.obs == max(num.obs)) 
> nt.bal <- num.obs[mode.num.obs] * mode.num.obs 
> pot.obs <- which(obs.all == mode.num.obs) 
> 
> # create new df w/o firms that don't run the whole sample period 
> pot.obs.index <- which(data$gvkey %in% pot.obs) 
> data.bal <- data[pot.obs.index, ] 
> 
> # write data to csv file 
> file.out <- paste(substr(file.in, 1, (nchar(file.in)-4)), "sorted.csv", sep="") 
> write.csv(data.bal, file.out) 
관련 문제