كيفية العثور على بيانات لوحة متوازنة في R (AKA ، كيفية العثور على الإدخالات في اللوحة كاملة فوق نافذة معينة)

StackOverflow https://stackoverflow.com/questions/3096495

  •  29-09-2019
  •  | 
  •  

سؤال

لدي لوحة كبيرة من البيانات من compustat. أقوم بإضافة بعض البيانات التي تم جمعها يدويًا (تم جمعها يدويًا من مجموعة من الكتب القديمة). لكني لا أرغب في جمع اللوحة بأكملها ، فقط مجموعة فرعية تم اختيارها عشوائيًا. للعثور على المجموعة الأكبر (التي أختار منها بشكل عشوائي) أود أن أبدأ باللوحة المتوازنة من Compustat.

أرى ال plm مكتبة للعمل مع لوحات غير متوازنة ، لكنني أود أن أبقيها متوازنة. هل هناك طريقة نظيفة للقيام بذلك إلى حد ما في البحث عن الشركات (الأفراد في الألواح) التي لا تدير فترة العينة؟ شكرًا!

هل كانت مفيدة؟

المحلول

بعد التفكير الثاني ، هناك طريقة أسهل بكثير للقيام بذلك.

انظر إلى هذا:

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)

نصائح أخرى

عند النظر إليها الآن ، فقدت التنسيق على بعض البيانات ، لكن يمكنني معرفة ذلك لاحقًا. ها هي محاولتي لأخذ الجزء المتوازن من اللجنة:

    > 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 20001231   264 JP3242800005
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 20001231   264  875   359  331
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
> 

تحديث: أعتقد أن هذا الحل أقل جودة ثم الآخر الذي نشرته أعلاه ، لكنني سأتركه كمثال على الحل - وهو ليس جيدًا :) *

مرحبا ريشارد ،

من الصعب بعض الشيء مع بعض بيانات العينة للمساعدة.

لكن يبدو أنه يمكنك إعادة تشكيل بياناتك باستخدام "Melt" و "Cast" من حزمة "Reshape". سيمكّنك القيام بذلك من العثور على مكان وجود عدد قليل جدًا من الملاحظة لكل موضوع ، ثم استخدام هذه المعلومات لمجموعة فرعية بياناتك.

فيما يلي رمز مثال على كيفية القيام بذلك:

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 

هتافات،

تال

> # 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top