2015-04-24 22 views
0

这是四列df。现场,参观,印第安纳州(ividual),观测值(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)。我想为站点X和站点Z添加对两个人(a和b)“未发生”的访问,并在观察列中添加一个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多个个人的简单版本。我正在努力完成我所追求的目标。简单的解决方案呢?谢谢。

也可以任何人想到这个职位更好的标题?

回答

1

我会做如下所示。网站,ind,访问的所有可能匹配由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>