这是一个四列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多个人。我正以一种快速的方式努力实现我所追求的目标。有简单的解决方案吗?感谢。
也可以有人想到这篇文章的更好的标题吗?
答案 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>