有沒有人知道dplyr方法對數據進行配對匹配,然後再進行算術運算?下面的for-loop重碼是基礎的MWE,但是我無法用dplyr的方法來解決問題(儘管出色的插圖和文檔)。如何使用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
)與處於相反狀態(adj1 == 4
和adj2 == 5
)的縣4和5相鄰,因爲1和2處於相同狀態,所以我們無視縣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
@AndrewMacDonald,上面編輯的圖片是我一直在思考這種關係的。 –