如何在不使用循环的情况下生成或更新变量? mutate
在这里工作不起作用(至少我不知道如何让它解决这个问题),因为我需要从另一个数据集中的多行计算内容。
我应该复制学术论文的回归结果,并且我试图生成回归中所需的一些变量。以下是我的需要。
subset
(包含
地理编码的住宅物业交易)和sch_relocs
(包含日期
学校搬迁活动及其地点)new
应为1(如果学校重新远离该区域,然后new
应为0)overlap
应为1,否则为0 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
}
}
这里是数据集的外观(只是相关变量)
带有所需结果的