R 如何为我的数据框中缺少的数据创建行
我正在不同场景中模拟人口。每个场景重复1000次,持续1000年。模型输出是一个单表,有三列:重复(R)、年份(Y)、总体规模(N)。 然而,模型输出不包含灭绝事件后数年的数据。例如,如果一个种群在600年灭绝(N=0),我在601到1000年的输出表中没有任何行 这里有一个小例子。假设我有三个场景重复,每个场景模拟了5年。我可能得到的是: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
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))
dlibrary(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
dat2expand.grid
+join
fromplyr
可以帮助您:
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')