R:如何使用dplyr mutate从单独的数据框中有效地引用/计算?

时间:2016-05-19 21:33:45

标签: r performance dplyr data-science

Hello stack overflow 社区,

给定两列数据框,纬度和经度点(dfLatLon),我想添加第三列,从列表中的单独数据框中查找半径约0.1英里的犯罪数量在丹佛市犯罪(dfCrimes)。

下面的解决方案有效(我发现搜索stackoverflow,谢谢!),但我有预感它效率低下,所以如果可能的话我想改进它。

我试图让这段代码可以重现(我已经阅读了足够多的帖子知道这是必须的),但你必须去下面的一个网站下载犯罪数据,大约是74MB。希望这不是问题。或者,您可以使用下面的其他方法(取消注释,注释另一个),这不需要您单独下载文件,因此可能更具可重复性,但我发现它要慢得多(336秒对16秒加载CSV)。

犯罪网页:http://data.denvergov.org/dataset/city-and-county-of-denver-crime

直接链接到数据:http://data.denvergov.org/download/gis/crime/csv/crime.csv

# Initialization Stuff
library(dplyr)
library(doParallel)
registerDoParallel(cores=4)
set.seed(77)  #In honor of Red Grange … Go Illini!

#Set Working Directory
#setwd("INSERT YOUR WD HERE, LOCATION OF CRIME DATA")

#Load Crime Data
dfCrimes <- read.csv("crime.csv")

#Alternate method to obtain file, no separate download or setting working directory required, but MUCH slower.
#dfCrimes <- read.csv("http://data.denvergov.org/download/gis/crime/csv/crime.csv")

#Set Degrees per Mile Constants
cstDegPerMileLat <- 0.01450737744
cstDegPerMileLon <- 0.01882547865

#Create Lats & Lons Data Frame (a grid of ~0.1mi centers in a square around Denver)
vecLat <- seq(39.6098, 39.9146, cstDegPerMileLat * 0.1)
vecLon <- seq(-105.1100, -104.5987, cstDegPerMileLon * 0.1)
dfLatLon <- expand.grid(vecLat, vecLon)
colnames(dfLatLon) <- c("lat","lon")

#Add 3rd Column
#THIS IS THE PART THAT I THINK CAN BE MORE EFFICIENT … PLEASE HELP!
system.time(dfLatLon <- dfLatLon %>% rowwise %>% mutate(newcol = sum( dfCrimes$IS_CRIME [  ((dfCrimes$GEO_LAT - lat)*(1/cstDegPerMileLat))^2 + ((dfCrimes$GEO_LON - lon)*(1/cstDegPerMileLon))^2 < 0.1^2 ])) )

#Wrapped formula above in system.time to measure efficiency.
#At its core, the formula above is just the basic formula for a circle, x^2 + y^2 = r^2, with adjustments to convert degrees of lat/lon to miles.

这需要747秒(~12分钟)才能运行并且只使用1个处理器,这比使用所有4个处理器在Excel中运行所花费的约30分钟更好。我意识到12分钟的时间并不长,但如果我将这个解决方案扩展到更大的问题,那就更重要了。

另外,我在Windows 10操作系统中运行R Studio。

以下是我的具体问题:

  1. 有没有办法使用dplyr更有效地运行它?我读过它对于这类问题非常有效。我怀疑rowwise是一个性能杀手(也许它没有矢量化;它可能是吗?),但是我没有能够在不使用rowwise的情况下运行它。
  2. 1a上。我应该从数据帧转换为data.tables吗?

    1b中。如何使用多个处理器来提高速度?看起来浪费让3个处理器内核闲置。

    1c上。我应该使用某种加入还是group_by?我不这么认为,因为没有直接引用精确的lat和lon,但如果这是正确的(更快的)答案,我会对这种可能性持开放态度。

    如果没有dplyr有更好的方法来解决这个问题,我希望看到它,但我也希望在dplyr中看到一个解决方案,这样我就可以更好地学习它。

    最后,请注意我为了学习R和数据科学而做这个分析(我不为丹佛市工作),并且正在探索更大的数据集以提高我的技能。我是R和数据科学的初学者,但我是一名分析师,在Excel中做了一些相当复杂的分析多年。我知道Excel的局限性,因此对R,数据科学和机器学习的潜力着迷。

    这是我的第一篇文章,所以希望我已经涵盖了所有内容。如果我遗漏了某些内容,发布在错误的位置,违反了某些规则等,请在评论中告诉我。

    非常感谢你的帮助!!!

    p p。,我知道我的拉特和离子间距不均匀,每英里的纬度/纬度也不均匀,这既是由于向北极的收敛,也是由于地球的非球形形状。我现在忽略了这一点。我只想知道如何使用dplyr有效地引用“外部”数据框。

    p.p.s。,最终我计划根据这些数据制作一个预测模型,可能正在尝试使用插入符号,但是现在我正在努力提高我的预处理技能。

0 个答案:

没有答案