【发布时间】:2020-10-17 07:34:33
【问题描述】:
我有一个包含用户数据的数据框
x <- data.frame("Address_line1" = c("461 road","PO Box 123","543 Highway"),
"City" = c("Dallas","Paris","New York" ), "Phone" = c("235","542","842"))
x
Address_line1 City Phone
1 461 road Dallas 235
2 PO Box 123 Paris 542
3 543 Highway New York 842
我有一个列表,其特征与数据框的顺序相同:
y = c("443 road","New york","842")
names(y) = colnames(x)
y
Address_line1 City Phone
"443 road" "New york" "842"
我想遍历这个数据帧的每一行,用 y 计算 x 的对应字段的stringdist(),将这些值相加并得到每一行的总分。
例如,第一行的分数是:
row_1 = stringdist("461 road","443 road",method="lv") + stringdist("Dallas","New york",method="lv") + stringdist("235","842",method="lv")
row_1
[1] 13
同样,我想要数据框所有行的分数。这是我使用 for 循环编写的代码:
list_dist = rep(NA,0)
for(i in seq_len(nrow(x))){
list_x = x[i,]
sum=0
for(j in seq_len(length(y))){
sum = sum + stringdist(y[j],list_x[[j]],method = "lv")
}
#print(sum)
list_dist[i] = sum
}
list_dist
[1] 13 18 8
我能够获得所需的输出,但问题在于计算时间。由于我的原始表包含约 100k 行和 10 列,因此代码运行需要近 30 分钟。我想知道是否有更有效的方法来做到这一点。
【问题讨论】:
-
乍一看,如果你知道你最终输出的长度,你可以预先分配你的列表对象
list_dist来加速for循环。否则你可以看看并行处理 -
y始终是向量还是 data.frame? -
@RuiBarradas
y也可以是一个 data.frame,在这种情况下,理想情况下,分数应该是一个大小为 nrow(y) x nrow(x) 的矩阵 -
好的,你能更新
y的例子吗?
标签: r dplyr tidyr stringdist