廣義而言,我嘗試使用apply(),以便處理一行取決於先前處理的行的結果。R apply() - 如何在循環中攜帶信息?
This post是相關的,但沒有幫助我建立結果。
我想從incidents
的數據幀中構建唯一「locations
」的數據幀。事件在地理座標(lon,lat)上註冊。 我通過lon
和lat
對事件進行了排序,然後依次使用apply()
進行排序。結果,我想得到像expectedResult之類的東西。 我檢查事件的地理座標是否與先前處理的地理座標相同。如果他們不是,我創建一個新的位置。如果是,我認爲事件發生在同一地點。
我的問題是,我不知道如何構建數據框/位置列表的位置時,將函數應用於事件。在將事件checkEquals
應用於事件之前,我創建了一個包含第一個位置的初始數據框locations
。
在我的示例數據中,第3行是故意重複的1,因此至少應將這些事件添加到同一位置。
checkEquals <- function(row,loc){
prevLoc <- loc[nrow(loc),]
if (as.numeric(row["lon"]) == as.numeric(prevLoc["lon"])
&& as.numeric(row["lat"]) == as.numeric(prevLoc["lat"])) {
# if (row == prevLoc) {
prevLoc["count"] <- as.numeric(prevLoc["count"]) + 1
loc[nrow(loc),] <- prevLoc
} else {
loc[nrow(loc)+1,] <- c(row["id"], row["lon"], row["lat"],count=1)
}
locations <<- loc
}
main <- function(){
incidents <- data.frame(id = c(1,2,3,4), lon = c(-81, -80, -81, -79), lat = c(42, 40, 42, 41))
incidents <- incidents[order(incidents$lon, incidents$lat),]
locations <- data.frame(id=1,lon=incidents[1,]$lon, lat=incidents[1,]$lat, count=0)
locations <- apply(incidents,1,checkEquals,locations)
print(locations)
expectedResult <- data.frame(id = c(1,2,4), lon = c(-81, -80, -79), lat = c(42, 40, 41), count = c(2,1,1))
print(expectedResult)
}
> main()
$`1`
id lon lat count
1 1 -81 42 1
$`3`
id lon lat count
1 1 -81 42 1
$`2`
id lon lat count
1 1 -81 42 0
2 2 -80 40 1
$`4`
id lon lat count
1 1 -81 42 0
2 4 -79 41 1
> expectedResult
id lon lat count
1 1 -81 42 2
2 2 -80 40 1
3 4 -79 41 1
在apply()
每次迭代中,程序進行比較針對初始locations
。我希望locations
隨着每次迭代而改變,添加行或修改現有的行。顯然最終的作業locations <<- loc
並沒有做到這一點,也沒有明確的assign()
。 此外,還有位置的格式問題,這是一個數據框列表,而不是數據框。
請仔細閱讀[我怎麼問一個很好的問題(http://stackoverflow.com/help/how-to-ask),[如何創建MCVE( http://stackoverflow.com/help/mcve)以及[如何在R中提供最小可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r -reproducible,例如#答案-5963610)。我建議你編輯你的問題,並提供最小的虛擬輸入數據,從你的具體問題中抽象出來,加上預期的輸出。 – lukeA
修訂後的問題可以通過其樣本數據進行重現,而且我認爲,這已足夠明確。問題仍然存在。 –
'事件[!重複(事件[,2:3]),]'給你'expectedResult'。 – lukeA