R:更新/生成没有循环的变量

时间:2016-03-02 23:29:31

标签: r loops

如何在不使用循环的情况下生成或更新变量? mutate在这里工作不起作用(至少我不知道如何让它解决这个问题),因为我需要从另一个数据集中的多行计算内容。

我应该复制学术论文的回归结果,并且我试图生成回归中所需的一些变量。以下是我的需要。

  • 此问题我有2个相关数据集subset(包含 地理编码的住宅物业交易)和sch_relocs(包含日期 学校搬迁活动及其地点)
  • 我需要计算每个住宅物业与最近的(重新安置的)学校之间的距离
  • 如果最近的学校是将重新定位到住宅区附近区域的学校,那么虚拟变量new应为1(如果学校重新远离该区域,然后new应为0)
  • 如果重新安置的学校只移动了一小段距离,并且房屋位于学校位置周围2km半径的重叠部分内,则虚拟变量overlap应为1,否则为0
  • 如果距离最近的学校的距离<= 2km,则虚拟变量in_zone应为1.如果距离在2km到4km之间,则这些事务被视为控制,因此in_zone如果距离大于4km,我应该从数据中删除观察值

我尝试使用for循环执行此操作,但它需要花费很长时间才能运行(一晚之后它还没有运行),所以我需要一个更好的方法来做到这一点。这是我的代码(非常混乱,我认为如果你想弄清楚我想要做什么,上面的解释会容易得多。

for (i in 1:as.integer(tally(subset))) {
    # dist to new sch locations
    for (j in 1:as.integer(tally(sch_relocs))) {
        dist = distHaversine(c(subset[i,]$longitude, subset[i,]$latitude),
                             c(sch_relocs[j,]$new_lon, sch_relocs[j,]$new_lat)) / 1000
        if (dist < subset[i,]$min_dist_new) {
            subset[i,]$min_dist_new = dist
            subset[i,]$closest_new_sch = sch_relocs[j,]$school_name
            subset[i,]$date_new_loc = sch_relocs[j,]$date_reloc
        }
    }

    # dist to old sch locations
    for (j in 1:as.integer(tally(sch_relocs))) {
        dist = distHaversine(c(subset[i,]$longitude, subset[i,]$latitude),
                             c(sch_relocs[j,]$old_lon, sch_relocs[j,]$old_lat)) / 1000
        if (dist < subset[i,]$min_dist_old) {
            subset[i,]$min_dist_old = dist
            subset[i,]$closest_old_sch = sch_relocs[j,]$school_name
            subset[i,]$date_old_loc = sch_relocs[j,]$date_reloc
        }
    }

    # generate dummy "new"
    if (subset[i,]$min_dist_new < subset[i,]$min_dist_old) {
        subset[i,]$new = 1
        subset[i,]$date_move = subset[i,]$date_new_loc
    }
    else if (subset[i,]$min_dist_new >= subset[i,]$min_dist_old) {
        subset[i,]$date_move = subset[i,]$date_old_loc
    }

    # find overlaps
    if (subset[i,]$closest_old_sch == subset[i,]$closest_new_sch & 
        subset[i,]$min_dist_old <= 2 & 
        subset[i,]$min_dist_new <= 2) {
        subset[i,]$overlap = 1
    }

    # find min dist
    subset[i,]$min_dist = min(subset[i,]$min_dist_old, subset[i,]$min_dist_new)


    # zoning
    if (subset[i,]$min_dist <= 2) {
        subset[i,]$in_zone = 1
    }
    else if (subset[i,]$min_dist <= 4) {
        subset[i,]$in_zone = 0
    }
    else {
        subset[i,]$in_zone = 2
    }
}

这里是数据集的外观(只是相关变量)

带有所需结果的

subset数据集(前2行): subset data set (first 2 rows)

sch_relocs数据集(仅包含相关列) sch_relocs data set

0 个答案:

没有答案