根据数据框中的分组变量添加缺失数据
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>
这是一个四列 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>