2016-04-22 41 views
1

廣義而言,我嘗試使用apply(),以便處理一行取決於先前處理的行的結果R apply() - 如何在循環中攜帶信息?

This post是相關的,但沒有幫助我建立結果。

我想從incidents的數據幀中構建唯一「locations」的數據幀。事件在地理座標(lon,lat)上註冊。 我通過lonlat對事件進行了排序,然後依次使用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()。 此外,還有位置的格式問題,這是一個數據框列表,而不是數據框。

+2

請仔細閱讀[我怎麼問一個很好的問題(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

+0

修訂後的問題可以通過其樣本數據進行重現,而且我認爲,這已足夠明確。問題仍然存在。 –

+0

'事件[!重複(事件[,2:3]),]'給你'expectedResult'。 – lukeA

回答

0

你可以做

df <- data.frame(id = c(1,2,3,4), 
       lon = c(-81.0000, -80, -81.0001, -79), 
       lat = c(42, 40, 42, 41)) 
library(dplyr) 
df %>% 
    group_by(lon=round(lon, 3), lat=round(lat, 3)) %>% 
    summarise(count=n()) 
# Source: local data frame [3 x 3] 
# Groups: lon [?] 
# 
#  lon lat count 
# (dbl) (dbl) (int) 
# 1 -81 42  2 
# 2 -80 40  1 
# 3 -79 41  1 
+0

是的,這就是我需要的!一個整潔的解決方法! –