【发布时间】:2014-06-23 02:29:56
【问题描述】:
有没有人知道一种 dplyr 方法,用于对缺失观测值的数据进行成对匹配,然后进行后续算术?下面的 for-loop 繁重代码是基本的 MWE,但我无法接受 dplyr 方法(尽管有出色的小插图和文档)。
简而言之,代码计算dev,这只是该周在相邻adj 商店出售的所有非缺失数量观察q 的平均值。
编辑:我对政策不同的州感兴趣。让下面的垂直线代表州界:县 1、2 和 3 处于 A 州(政策 A),县 4、5 和 6 处于州 B(政策 B)。县可能有多家商店。
----|----
1 | 4
|----
----| 5
2 |
----|----
3 | 6
----|----
contig.id 标识与相反州的一个或多个县相邻的县。例如,县 1 (contig.id == 1) 与相反州的县 4 和 5 相邻(adj1 == 4 和 adj2 == 5),我们忽略县 2 的地理邻接,因为 1 和 2 处于同一州。
通过同样的方法,县 4 (contig.id == 4) 仅与县 1 相邻(adj1 == 1 和 adj2 == NA)。
结束编辑。
df <- data.frame(store = c(1001,1001,145,331,228,228,500,500,61,1135),
end.week = c(20061125,20061118,20061125,20061125,20061125,
20061118,20061125,20061118,20061118,20061125),
contig.id = c(1,1,2,3,4,4,4,4,5,NA),
adj1 = c(4,4,5,6,1,1,1,1,1,NA),
adj2 = c(5,5,NA,NA,NA,NA,NA,NA,2,NA),
q = c(12.25,14.5,18.75,16,16.5,22,55.25,8.25,24,37.75))
dev <- NULL
dev1 <- NULL
for (i in 1:length(df$contig.id)) {
temp1 <- integer(0)
temp2 <- integer(0)
if (is.na(df$contig.id[i]) == FALSE) {
temp1 <- which( (df$contig.id == df$adj1[i]) &
(df$end.week == df$end.week[i]))
if (length(temp1) > 0) {
dev[i] <- sum(df$q[temp1])
}
if (is.na(df$adj2[i]) == FALSE) {
temp2 <- which( (df$contig.id == df$adj2[i]) &
(df$end.week == df$end.week[i]) )
if (length(temp2) > 0) {
dev[i] <- dev[i] + sum(df$q[temp2])
}
}
} else {
dev[i] <- NA
}
dev[i] <- dev[i]/(length(temp1) + length(temp2))
dev1[i] <- (df$q[i])/dev[i]
}
df <- cbind(df,dev,dev1)
【问题讨论】:
-
我认为这应该是可能的,但我无法完全理解 adj1、adj2 和 contig.id 的关系。你能详细解释一下吗?
-
@AndrewMacDonald,上面编辑中的图片是我一直在思考的关系。