كيفية العثور على بيانات لوحة متوازنة في R (AKA ، كيفية العثور على الإدخالات في اللوحة كاملة فوق نافذة معينة)
سؤال
لدي لوحة كبيرة من البيانات من 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)