根据数据框中的分组变量添加缺失数据

Adding missing data conditional on grouping variables within data frame

这是一个四列 df。站点、访问、Ind(个人)、Obs(erved)

site<-c(rep("X",6),rep("Y",8),rep("Z",4))
visit<-c(1,1,2,2,3,3,1,1,2,2,3,3,4,4,1,1,2,2)
ind<-c(rep(c("a","b"),9))    
obs<-1    
dat<-as.data.frame(cbind(site,visit,ind,obs))

在这个例子中,我有三个访问量不相等的站点(X=3、Y=4、Z=2)。我想为两个人(a 和 b)添加 "did not occur" 的站点 X 和 Z 的访问,并且在观察列中有一个 NA。如本例所示:

site<-c(rep("X",8),rep("Y",8),rep("Z",8))
visit<-c(1,1,2,2,3,3,4,4,1,1,2,2,3,3,4,4,1,1,2,2,3,3,4,4)
ind<-c(rep(c("a","b"),12))    
obs<-c(rep(1,6),NA,NA,rep(1,12),rep(NA,4))    
dat2<-as.data.frame(cbind(site,visit,ind,obs))

这是包含 500 多个站点和 300 多个个人的非常大的数据集的简单得多的版本。我正在努力寻找一种快速的方法来完成我所追求的目标。那里有简单的解决方案?谢谢

还有谁能为这个 post 想出更好的标题吗?

我会按如下所示进行操作。 site、ind、visit 的所有可能匹配项均由 expand.grid() 创建。然后将数据连接到它,这是保留所有扩展值的左外连接 (all.x = TRUE)

# your data
site<-c(rep("X",6),rep("Y",8),rep("Z",4))
visit<-c(1,1,2,2,3,3,1,1,2,2,3,3,4,4,1,1,2,2)
ind<-c(rep(c("a","b"),9))
obs <- 1
dat<-as.data.frame(cbind(site,visit,ind,obs))
# all matches of site, ind, visit
site <- c("X", "Y", "Z")
ind <- c("a", "b")
visit <- c(1, 2, 3, 4)
grid <- expand.grid(site = site, ind = ind, visit = visit)
# merge - left outer join that keeps all grid values
merge(grid, dat, by = c("site", "ind", "visit"), all.x = TRUE)
   site ind visit  obs
1     X   a     1    1
2     X   a     2    1
3     X   a     3    1
4     X   a     4 <NA>
5     X   b     1    1
6     X   b     2    1
7     X   b     3    1
8     X   b     4 <NA>
9     Y   a     1    1
10    Y   a     2    1
11    Y   a     3    1
12    Y   a     4    1
13    Y   b     1    1
14    Y   b     2    1
15    Y   b     3    1
16    Y   b     4    1
17    Z   a     1    1
18    Z   a     2    1
19    Z   a     3 <NA>
20    Z   a     4 <NA>
21    Z   b     1    1
22    Z   b     2    1
23    Z   b     3 <NA>
24    Z   b     4 <NA>