R 如何为我的数据框中缺少的数据创建行

R 如何为我的数据框中缺少的数据创建行,r,missing-data,R,Missing Data,我正在不同场景中模拟人口。每个场景重复1000次,持续1000年。模型输出是一个单表,有三列:重复(R)、年份(Y)、总体规模(N)。 然而,模型输出不包含灭绝事件后数年的数据。例如,如果一个种群在600年灭绝(N=0),我在601到1000年的输出表中没有任何行 这里有一个小例子。假设我有三个场景重复,每个场景模拟了5年。我可能得到的是: R Y N 1 1 30 1 2 25 1 3 20 1 4 10 1 5 0 2 1 30 2

我正在不同场景中模拟人口。每个场景重复1000次,持续1000年。模型输出是一个单表,有三列:重复(R)、年份(Y)、总体规模(N)。 然而,模型输出不包含灭绝事件后数年的数据。例如,如果一个种群在600年灭绝(N=0),我在601到1000年的输出表中没有任何行

这里有一个小例子。假设我有三个场景重复,每个场景模拟了5年。我可能得到的是:

R   Y   N
1   1   30
1   2   25
1   3   20
1   4   10
1   5   0
2   1   30
2   2   0
3   1   30
3   2   28
3   3   10
3   4   0

structure(list(R = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 
3L), Y = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 1L, 2L, 3L, 4L), N = c(30L, 
25L, 20L, 10L, 0L, 30L, 0L, 30L, 28L, 10L, 0L)), .Names = c("R", 
"Y", "N"), class = "data.frame", row.names = c(NA, -11L))
但我需要的是:

R   Y   N
1   1   30
1   2   25
1   3   20
1   4   10
1   5   0
2   1   30
2   2   0
2   3   0
2   4   0
2   5   0
3   1   30
3   2   28
3   3   10
3   4   0
3   5   0
插入缺失行的最快方法是什么? 可能使用“应用”是个好主意? 或者先创建一个空数据帧

d <- data.frame(Rep=sort(rep(1:1000,1000)), Year=rep(1:1000,1000), NInds=numeric(1000000))
d
library(plyr)
ddply(DF,R),函数(DF){

Y另一种溶液,仅base-R:

r2 <- rep(1:3, each=5)
y2 <- rep(1:5, times=3)
rymissing <- setdiff(paste(r2, y2), paste(df$R, df$Y))
rymissing <- matrix(as.numeric(unlist(strsplit(rymissing, " "))), ncol=2, dimnames=list(NULL, c("R", "Y")), byrow=TRUE)
df2 <- rbind(df, cbind(as.data.frame(rymissing), N=0))
df2 <- df2[order(df2$R, df2$Y),]
row.names(df2) <- NULL
df2

r2我会做类似的事情(尽管我不确定你的例子是真实的还是仅仅是玩具,那么它可能不适合你的要求)。
假设
dat
是您的数据

dat2 <- data.frame(R = rep(seq_len(3), each = 5), Y = rep(seq_len(5), 3), N = 0)
dat2$N[paste(dat2$R, dat2$Y) %in% paste(dat$R, dat$Y)] <- dat$N

#    R Y  N
# 1  1 1 30
# 2  1 2 25
# 3  1 3 20
# 4  1 4 10
# 5  1 5  0
# 6  2 1 30
# 7  2 2  0
# 8  2 3  0
# 9  2 4  0
# 10 2 5  0
# 11 3 1 30
# 12 3 2 28
# 13 3 3 10
# 14 3 4  0
# 15 3 5  0

dat2
expand.grid
+
join
from
plyr
可以帮助您:

data <- join(expand.grid(R=1:3, Y=1:5), data)
data$N[is.na(data$N)] <- 0

# not necessary but better for comparison to your example
data[order(data$R),]

# not necessary but better for comparison to your example
data[order(data$R),]
##    R Y  N
## 1  1 1 30
## 4  1 2 25
## 7  1 3 20
## 10 1 4 10
## 13 1 5  0
## 2  2 1 30
## 5  2 2  0
## 8  2 3  0
## 11 2 4  0
## 14 2 5  0
## 3  3 1 30
## 6  3 2 28
## 9  3 3 10
## 12 3 4  0
## 15 3 5  0

另一种仅使用base R的潜在解决方案:

empty <- data.frame(R=sort(rep(1:3,5)), Y=rep(1:5,3), N=numeric(15))
res <- merge(empty,data,by=c("R","Y"),all=T)[,c(1,2,4)] 
res[is.na(res[,3]),3] <- 0 
names(res) <- c('R','Y','N')

empty我刚刚意识到这个问题之前已经得到了充分的回答:删除这个问题?尽管之前存在类似的问题,但在10分钟内(!)更好的答案(更快的代码)出现在这里。很棒的社区。相当快!谢谢你,这也很好,但是David Arenburg的代码更快(更短)。无论如何,非常感谢!感谢您的速度比较!对我来说结果相同!“加入”听起来很有希望,但速度稍慢。
ddply
user  system elapsed 
0.003   0.000   0.003 

expand.grid
user  system elapsed 
0.002   0.000   0.002 

pureR
user  system elapsed 
0.001   0.000   0.001 

pureR2
user  system elapsed 
0.002   0.000   0.001 
empty <- data.frame(R=sort(rep(1:3,5)), Y=rep(1:5,3), N=numeric(15))
res <- merge(empty,data,by=c("R","Y"),all=T)[,c(1,2,4)] 
res[is.na(res[,3]),3] <- 0 
names(res) <- c('R','Y','N')