从广义上讲,我尝试使用apply(),以便处理一行取决于先前处理的行的结果。
This post是相关的,但没有帮助我建立结果。
我想从locations
的数据框构建一个唯一“incidents
”的数据框。这些事件在地理坐标(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()
。
此外,仍然存在位置的格式问题,这是一个数据帧列表而不是数据帧。
答案 0 :(得分:0)
你可以做到
{{1}}