R apply() - 如何通过循环传递信息?

时间:2016-04-22 20:58:20

标签: r loops apply assign sapply

从广义上讲,我尝试使用apply(),以便处理一行取决于先前处理的行的结果

This post是相关的,但没有帮助我建立结果。

我想从locations的数据框构建一个唯一“incidents”的数据框。这些事件在地理坐标(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()。 此外,仍然存在位置的格式问题,这是一个数据帧列表而不是数据帧。

1 个答案:

答案 0 :(得分:0)

你可以做到

{{1}}