【问题标题】:Replacing data.frame by data_frame() and cbind by bind_cols() from dplyr用 dplyr 中的 data_frame() 和 bind_cols() 替换 data.frame 和 cbind
【发布时间】:2015-03-12 15:59:22
【问题描述】:

我正在尝试使用dplyr 的最新功能重写我的部分代码,方法是将data.frame() 替换为data_frame(),并将cbind() 替换为bind_cols()

library(rgeos)
library(dplyr)

mc <- montreal %>%
  gCentroid(byid=TRUE) %>%
  data.frame %>%
  cbind(., name = montreal[["NOM"]])

当我尝试用 data_frame 替换 data.frame 时,我得到:

Error: data_frames can only contain 1d atomic vectors and lists

当我尝试用 bind_cols 替换 cbind 时,我得到:

Error: object at index 2 not a data.frame

有没有办法让这个工作?

这里,montreal 是一个 SpatialPolygonsDataframe:

GEOJSON 文件:http://elm.bi/limadmin.json

montreal <- readOGR("data/limadmin.json", "OGRGeoJSON")

【问题讨论】:

  • 由于 S4 对象,您的 dput 输出无法重建。您可能想尝试this question 的解决方案并返回可重现的数据。
  • 您能否提供代码行来从头开始创建它而不是 dput
  • 我相应地编辑了帖子
  • mc &lt;- montreal %&gt;% gCentroid(byid=TRUE) %&gt;% data.frame %&gt;% bind_cols(., data_frame(name=montreal[["NOM"]]))怎么样
  • data_frame()data.frame() 不同。 data.frame() 做了很多很多事情。 data_frame() 只做一个 - 它为每个输入创建一列。

标签: r dplyr sp


【解决方案1】:

所以我最终在这两种方法上运行microbenchmark,因为使用起来感觉有点奇怪:

mc <- montreal %>% 
    gCentroid(byid=TRUE) %>% 
    data.frame %>% 
    bind_cols(., data_frame(name=montreal[["NOM"]]))

我尝试了两个不同的数据集:

world <- readOGR("data/world.json", "OGRGeoJSON")

wmbm = microbenchmark(
  base = world %>% 
    gCentroid(byid=TRUE) %>% 
    data.frame %>% 
    cbind(., name=world[["name"]]),
  dplyr = world %>% 
    gCentroid(byid=TRUE) %>% 
    data.frame %>% 
    bind_cols(., data_frame(name=world[["name"]])),
  times=100
)

微基准测试结果:

Unit: milliseconds
  expr      min       lq     mean   median       uq      max neval
  base 13.78396 14.08301 14.21357 14.12023 14.16435 20.04362   100
 dplyr 13.87098 14.10680 14.25245 14.14330 14.18020 17.63248   100

montreal <- readOGR("data/limadmin.json", "OGRGeoJSON")

lmbm = microbenchmark(
  base = montreal %>% 
    gCentroid(byid=TRUE) %>% 
    data.frame %>% 
    cbind(., name=montreal[["NOM"]]),
  dplyr = montreal %>% 
    gCentroid(byid=TRUE) %>% 
    data.frame %>% 
    bind_cols(., data_frame(name=montreal[["NOM"]])),
  times=100
  )

微基准测试结果:

Unit: milliseconds
  expr      min       lq     mean   median       uq      max neval
  base 1.597957 1.628723 1.736709 1.651747 1.686554 3.091738   100
 dplyr 1.621092 1.642678 1.756978 1.659041 1.739707 3.751866   100

这里没有真正的结论。尽管看起来有点慢,但我想我会坚持使用dplyr-esque 解决方案以保持一致性。

【讨论】:

    猜你喜欢
    • 2022-07-07
    • 2020-07-09
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多