Yani ben o "zarif" şartını karşılayan emin değilim, ama burada dengeli veri almak için kullanabileceğiniz genel amaçlı bir fonksiyon.
balanced<-function(data, ID, TIME, VARS, required=c("all","shared")) {
if(is.character(ID)) {
ID <- match(ID, names(data))
}
if(is.character(TIME)) {
TIME <- match(TIME, names(data))
}
if(missing(VARS)) {
VARS <- setdiff(1:ncol(data), c(ID,TIME))
} else if (is.character(VARS)) {
VARS <- match(VARS, names(data))
}
required <- match.arg(required)
idf <- do.call(interaction, c(data[, ID, drop=FALSE], drop=TRUE))
timef <- do.call(interaction, c(data[, TIME, drop=FALSE], drop=TRUE))
complete <- complete.cases(data[, VARS])
tbl <- table(idf[complete], timef[complete])
if (required=="all") {
keep <- which(rowSums(tbl==1)==ncol(tbl))
idx <- as.numeric(idf) %in% keep
} else if (required=="shared") {
keep <- which(colSums(tbl==1)==nrow(tbl))
idx <- as.numeric(timef) %in% keep
}
data[idx, ]
}
İlk parametre subsetine isteyen data.frame olan
balanced(unbal, "PERSON","YEAR")
# PERSON YEAR Y X
# 1 Frank 2001 21 1
# 2 Frank 2002 22 2
# 3 Frank 2003 23 3
# 4 Frank 2004 24 4
# 5 Frank 2005 25 5
# 11 Edward 2001 31 11
# 12 Edward 2002 32 12
# 13 Edward 2003 33 13
# 14 Edward 2004 34 14
# 15 Edward 2005 35 15
ile istediğiniz sonucu alabilirsiniz. İkinci parametre (ID=
), veri kümesindeki her bir "kişiyi" tanımlayan sütun adlarının bir karakter vektörüdür. Daha sonra TIME=
parametresi, her bir ID için farklı gözlem sürelerini belirten bir karakter vektörüdür. Son olarak, isteğe bağlı olarak (kimlik veya ZAMAN değerlerinden daha tüm diğer varsayılan) NA olması gereken alanların belirtmek için bir VARS=
argüman belirtebilirsiniz. Son olarak, her kimlik her TIME için bir gözlem (varsayılan) olması gerekir olmadığını belirten required
adlı son bir parametre yoktur ya da "ortak" olarak ayarlarsanız, yalnızca tüm kimlikleri için eksik olmayan değerlere sahip olduğunu TIMES dönecektir.
Yani örneğin
balanced(unbal, "PERSON","YEAR", "X")
# PERSON YEAR Y X
# 1 Frank 2001 21 1
# 2 Frank 2002 22 2
# 3 Frank 2003 23 3
# 4 Frank 2004 24 4
# 5 Frank 2005 25 5
# 6 Tony 2001 5 6
# 7 Tony 2002 6 7
# 8 Tony 2003 NA 8
# 9 Tony 2004 7 9
# 10 Tony 2005 8 10
# 11 Edward 2001 31 11
# 12 Edward 2002 32 12
# 13 Edward 2003 33 13
# 14 Edward 2004 34 14
# 15 Edward 2005 35 15
Sadece "X" Tüm KİŞİ/YIL NA olmasını gerektirir ve bu tüm kayıtlar için geçerlidir, çünkü hiçbir alt ayar gerçekleşir. Sonra
balanced(unbal, "PERSON","YEAR", required="shared")
# PERSON YEAR Y X
# 1 Frank 2001 21 1
# 2 Frank 2002 22 2
# 4 Frank 2004 24 4
# 5 Frank 2005 25 5
# 6 Tony 2001 5 6
# 7 Tony 2002 6 7
# 9 Tony 2004 7 9
# 10 Tony 2005 8 10
# 11 Edward 2001 31 11
# 12 Edward 2002 32 12
# 14 Edward 2004 34 14
# 15 Edward 2005 35 15
yaparsanız hepsi bu yıllar için veri beri
TÜM kişiler için yıllar 2001, 2002, 2004, 2005 için veri olsun.
Şimdi
kullanımı biraz daha farklı bir örnek verileri oluşturmasına izin Edward Bu
balanced(unbal2, "PERSON","YEAR")
# [1] PERSON YEAR Y X
# <0 rows> (or 0-length row.names)
şimdi başka bir şey döndüren demektir 2006 için bir değere sahip tek kişi olduğunu
unbal2 <- unbal
unbal2[15, 2] <- 2006
tail(unbal2)
# PERSON YEAR Y X
# 10 Tony 2005 8 10
# 11 Edward 2001 31 11
# 12 Edward 2002 32 12
# 13 Edward 2003 33 13
# 14 Edward 2004 34 14
# 15 Edward 2006 35 15
Bildirim şimdi set Tüm kişilerin veri sahibi olmaları nedeniyle, 2001, 2004, 2004 için verileri döndürecektir. o yıllar.
(UA doldurarak dengeli dengesiz paneli), bir işlev kullanabilirsiniz yapmak 'yapmak "plm" den paketlenmiş. (https://r-forge.r-project.org/R/?group_id=406 adresinden gerekli olan en son geliştirme sürümü) – Helix123
Şimdi plm resmi CRAN sürümü (1.6-4) var. make.pbalanced 'dahil edildi (ve argüman' balance.type = c ("fill", "shared") 'biri verileri genişletip genişletmeyeceğinizi ya da azaltmayı seçebilir. – Helix123