所以我不確定它是否滿足「優雅」的要求,但這裏有一個通用函數可以用來獲得平衡的數據。
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, ]
}
您可以
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
得到你想要的結果的第一個參數是要子集data.frame。第二個參數(ID=
)是標識數據集中每個「人員」的列名的字符向量。然後,TIME=
參數也是一個字符向量,用於指定每個ID的不同觀察時間。最後,您可以選擇指定VARS=
參數來指定哪些字段必須是NA(默認爲ID或TIME值以外的所有字段)。最後,還有一個名爲required
的最後一個參數,它說明每個ID對每個TIME(默認值)都必須有一個觀察值,還是將其設置爲「shared」,它將只返回所有ID都具有非缺失值的TIMES。
因此,例如
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
只需要在「X」是NA所有人/年,因爲這是所有記錄真實的,沒有子設置發生。
如果你
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
那麼你得到2001年,2002年,2004年,2005年所有人的數據,因爲他們都對這些年的數據。
現在讓我們用創造一個稍微不同的樣本數據集
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
注意,現在愛德華是具有價值在2006年的唯一的人這意味着
balanced(unbal2, "PERSON","YEAR")
# [1] PERSON YEAR Y X
# <0 rows> (or 0-length row.names)
現在返回什麼,但
balanced(unbal2, "PERSON","YEAR", required="shared")
# PERSON YEAR Y X
# 1 Frank 2001 21 1
# 2 Frank 2002 22 2
# 4 Frank 2004 24 4
# 6 Tony 2001 5 6
# 7 Tony 2002 6 7
# 9 Tony 2004 7 9
# 11 Edward 2001 31 11
# 12 Edward 2002 32 12
# 14 Edward 2004 34 14
將返回2001,2002,2004的數據,因爲所有人都有數據fo那些年。
如果問津倒過來(使不平衡的面板通過在港定居填充平衡),可以使用該功能使' .pm包中的.pbalanced'(需要https://r-forge.r-project.org/R/?group_id=406的最新開發版本) – Helix123 2016-06-28 19:32:11
plm的官方CRAN版本(1.6-4)現在擁有' make.pbalanced '併入(並通過參數'balance.type = c(「fill」,「shared」)'可以選擇是擴展數據還是減少數據。 – Helix123 2016-11-30 08:22:50