用 data_frame() 替换 data.frame 并用 dplyr 中的 bind_cols() 替换 cbind
Replacing data.frame by data_frame() and cbind by bind_cols() from dplyr
我正在尝试使用 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")
所以我最终选择了 运行 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 解决方案以保持一致性。
我正在尝试使用 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")
所以我最终选择了 运行 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 解决方案以保持一致性。