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

时间:2015-04-24 23:09:16

标签: r missing-data

这是一个四列df。 Site,Visit,Ind(ividual),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)。我想为网站X和Z添加访问次数&#34;没有发生&#34;对于个体(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 个答案:

答案 0 :(得分: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>