【问题标题】:R speed up sapplyR 加速 sapply
【发布时间】:2018-12-11 04:17:57
【问题描述】:

我在循环中有以下脚本:

number_of_rows_similar_addresses <- as.data.table(cbind(
    distinct_similar_addresses,
    sapply(distinct_similar_addresses, function(x) {
        length(similar_addresses[Original_Address == x]$people_names) / length(unique(similar_addresses[Original_Address == x]$people_names))
    })
))

问题是它大大减慢了循环。

数据如下:

distinct_similar_addresses:

"U 2 5 TIMPERLEY ST NICHOLLS VIC"       
"U 1 3 TIMPERLEY ST NICHOLLS VIC"                            
"U 1 11 TIMPERLEY ST NICHOLLS VIC"                            
"U 1 33 TIMPERLEY ST NICHOLLS VIC"                           
"U 1 2 TIMPERLEY ST NICHOLLS VIC"                            
"U 1 3 TIMPERLEY ST NICHOLLS VIC"                            
"U 1 5 TIMPERLEY ST NICHOLLS VIC" 

相似地址:

    people_names,Original_Address,Numbers,street_Name,street_type,post_code,suburb,PO,UID
Giuseppe Conte,U 1 3 TIMPERLEY ST NICHOLLS VIC,1,TIMPERLEY,ST,5469,NICHOLLS,,
Giuseppe Conte,U 1 3 TIMPERLEY ST NICHOLLS VIC,TIMPERLEY,ST,5469,NICHOLLS,,
Mario Pertini,U 2 5 TIMPERLEY ST NICHOLLS VIC,TIMPERLEY,ST,5469,NICHOLLS,,
Mario Pertini,U 2 5 TIMPERLEY ST NICHOLLS VIC,5,TIMPERLEY,ST,5469,NICHOLLS,,

脚本正在评估地址是指一个单元还是一个房子。 有什么方法可以更快地完成这项任务?

我正在添加一个结果集和一个解释,以便它的作用变得更容易理解。

结果集:

   distinct_similar_addresses      V2
"U 2 5 TIMPERLEY ST NICHOLLS VIC"   2
"U 1 3 TIMPERLEY ST NICHOLLS VIC"   2

代码只是计算与单行地址关联的名称数量。 事实上,如果地址重复,则意味着它指的是一个单元,否则它是一个单独的房子。

【问题讨论】:

  • 鉴于示例数据,您的代码不可重现。你能再检查一下吗?我也不明白你的意思是什么“脚本正在评估地址是指一个单元还是一个房子。”你想达到什么目的?您能否为您提供的样本包括您的预期输出?
  • 我已经更改了数据集并添加了一个结果集。
  • 两个数据集都是data.table
  • 您的最后两句话将由similar_addresses[, .N, by = Original_Address] 解决。我建议你研究一下 data.table 小插曲。
  • 顺便说一句,请学习提供可重现的示例。您的数据无法正确导入(因为某些行中缺少列)。

标签: r performance apply text-mining


【解决方案1】:

很抱歉给您带来数据不便,感谢 Roland 的帮助。

这就是解决办法

  x <- similar_addresses[, .N, by = Original_Address] %>% select('N')
  y <- similar_addresses[, length(unique(people_names)) , by = Original_Address] %>% select('V1')
  number_of_rows_similar_addresses <- cbind(unique(similar_addresses$Original_Address), x/y)

【讨论】:

  • 因为你使用data.table,特别是因为你不需要xy作为数据表(向量很好)你可能更喜欢语法[, N]替换%&gt;% select('N')。或$N.
【解决方案2】:

感谢格雷戈尔, 这可能更好:

 x <- similar_addresses[, .N, by = Original_Address]$N
 y <- similar_addresses[, length(unique(people_names)) , by = Original_Address]$V1
 number_of_rows_similar_addresses <- cbind(unique(similar_addresses$Original_Address), x/y)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多