【发布时间】:2014-08-17 17:14:59
【问题描述】:
我正在处理具有唯一案例标识符和观察时间点列(长格式)的面板数据。既有时间常数变量,也有随时间变化的观测值:
id time tc1 obs1
1 101 1 male 4
2 101 2 male 5
3 101 3 male 3
4 102 1 female 6
5 102 3 female 2
6 103 1 male 2
对于我的模型,我现在需要每个时间点每个 id 具有完整记录的数据。换句话说,如果缺少观察结果,我仍然需要将观察变量的 id、时间、时间常数变量和 NA 放在一行中(如 (102, 2, "female", NA 行)在上面的例子中)。所以我的问题是:
- 如何确定我的数据集中是否已经存在具有唯一 id 和 time 组合的行?
- 如果没有,我该如何添加这一行、结转时间常数变量并用 NA 填充观察结果?
如果有人能对此有所了解,那就太好了。
提前非常感谢!
编辑
感谢大家的回复。这是我最终所做的,它混合了几种建议的方法。问题是我每行有几个随时间变化的变量(obs1-obsn),我没有让 dcast 适应它 - value.name 只需要参数。
# create all possible permutations of id and year
iddat = expand.grid(id = unique(dataset$id), time = (c(1996,1999,2002,2005,2008,2011)))
iddat <- iddat[order(iddat$id, iddat$time), ]
# add permutations to existing data, combinations so far missing are NA
dataset_new <- merge(dataset, iddat, all.x=TRUE, all.y=TRUE, by=c("id", "time"))
# drop time-constant variables from data
dataset_new[c("tc1", "tc2", "tc3")] <- list(NULL)
# merge back time-constant variables from original data
temp <- dataset[c("tc1", "tc2", "tc3")]
dataset_new <- merge(dataset_new, temp, by=c("id"))
# sort
dataset_new <- dataset_new[order(dataset_new$id, dataset_new$time), ]
dataset_new <- unique(dataset_new) # some rows are duplicates after last merge, no idea why
rm(temp)
rm(iddat)
一切顺利,再次感谢马特
【问题讨论】:
-
您应该包含原始数据以使您的问题易于复制——看看
dput -
但基本上,如果您有一个应该存在的id和时间列表,您可以使用
merge将其与此数据合并。对于那些不存在的 id 和时间,您将获得 NA -
如果您需要创建一个包含所有可能的 id/time/tc1 组合的数据集以与
merge一起使用,您可以将expand.grid与数据集中的适当信息一起使用:iddat = expand.grid(id = unique(dat$id), time = unique(dat$time), tc1 = unique(dat$tc1))。 -
有函数
make.pbalanced和make.pconsecutive在包plm(r-forge.r-project.org/R/?group_id= 406). 跨度>