我有需要比较的地址。多亏了此站点上的一个有用答案,我有90%的方法可以到达那里,但是我需要最后的10%。
我有下面的代码来生成用于比较的地址。我需要查看addr1
和addr2
之间是否有任何区别。
eg_data <- data.frame(addr1 = c('123 Main St','742 Evergreen
Ter','8435 Roanoke Dr','1340 N State Pkwy') , addr2 = c('123
Main St Apt 4','742 Evergreen Terrace','8435 Roanoke Dr Unit
5','1340 N State Pkwy'), stringsAsFactors = FALSE)
下一部分非常有用,它将vecsets
子功能vsetdiff
与strsplit
组合在一起,以比较两者并提取任何差异
eg_data$addr_comp2_1 <- mapply(vsetdiff, strsplit(eg_data$addr2,
split=""), strsplit(eg_data$addr1, split=""))
运行代码,看看,但剩下的是像{{1}}这样的格式,其中b / t是row1地址的差异,它是列表形式的。我需要此列是字符串或因子的单独行。在数据视图中,我需要查看c(" ","A","p","t"," ","4")
而不是"addr_comp2_1 : chr "123..."
:清单4,以便数据框本身在col3 / row1中给我“ Apt 4”,而不是addr_comp2_1
。
我尝试过
c(" ","A","p","t"," ","4")
这些显然不起作用。 eg_data$fix <- paste(eg_data$addr_comp2_1, collapse=', ')
eg_data$fix2 <- str_c(eg_data$addr_comp2_1, collapse=',')
eg_data$fix3 <- as.factor(eg_data$addr_comp2_1)
eg_data$fix4 <- lapply(eg_data$addr_comp2_1, unlist)
eg_data$fix5 <- (matrix(unlist(eg_data$addr_comp2_1), nrow=4,
byrow=F))
eg_data$fix6 <- unlist(eg_data$addr_comp2_1, use.names=FALSE,
recursive=FALSE)
是接近的,但是它给每个单独的字符自己的行,而不是fix5
的分组,所以我最终得到17行,而不是添加四列。
感谢您的帮助。
答案 0 :(得分:1)
您只需要串联结果。 # this module will be useful
import math
# your point to move
point = [x, y]
# use your slope and intercept
m = slope
b = intercept
# get two points from the line
x1, y1 = 0, b
x2 = 1
y2 = m*x2+b
# get line in vector form
line = [x2-x1, y2-y1]
# normalize
norm = math.hypot(line[0], line[1])
norm_line = [line[0]/norm, line[1]/norm]
# project point onto norm_line
comp = (norm_line[0]*point[0]+norm_line[1]*point[1])
proj = [norm_line[0]*comp, norm_line[1]*comp]
# this should be your new point
new_point = [proj[0]+x1, proj[1]+y1]
函数将为您完成此任务。
代码
lapply
输出