问题描述
我正在处理大型数据集,为此我编写了一个代码来对数据帧执行逐行操作,这是顺序的。这个过程很慢。 我正在尝试使用并行处理来执行操作以使其更快。
这是代码
library(geometry)
# Data set - a
data_a = structure(c(10.4515034409741,15.6780890052356,12.5581992918563,9.19067944250871,14.4459166666667,11.414,17.65325,12.468,11.273,15.5945),.Dim = c(5L,2L),.Dimnames = list(c("1","2","3","4","5"),c("a","b")))
# Data set - b
data_b = structure(c(10.4515034409741,11.3318076923077,13.132273830156,6.16003995082975,11.59114820435,10.9573192090395,15.5945,11.5245,12.0249,6.3186,13.744,11.0921),.Dim = c(10L,"5","6","7","8","9","10"),"b")))
conv_hull_1 <- convhulln( data_a,options = "FA") # Draw Convex Hull
test = c()
for (i in 1:nrow(data_b)){
df = c()
con_hull_all <- inhulln(conv_hull_1,matrix(data_b[i,],ncol = 2))
df$flag <- ifelse(con_hull_all[1] == TRUE,ifelse(con_hull_all[1] == FALSE,1,2))
test <- as.data.frame(rbind(test,df))
print(i)
}
test
有没有办法并行化行明智的计算?
如您所见,对于小数据集,计算时间确实很短,但是一旦我增加数据大小,计算时间就会急剧增加。
你能用代码提供解决方案吗? 提前致谢。
解决方法
您可以利用 inhulln
函数的参数。这允许传入多于一行的待测试点。
我已经在根据原始数据制作的 320,000 行矩阵上尝试了下面的代码,而且速度很快。
library(geometry)
library(dplyr)
# Data set - a
data_a = structure(
c(
10.4515034409741,15.6780890052356,12.5581992918563,9.19067944250871,14.4459166666667,11.414,17.65325,12.468,11.273,15.5945
),.Dim = c(5L,2L),.Dimnames = list(c("1","2","3","4","5"),c("a","b"))
)
# Data set - b
data_b = structure(
c(
10.4515034409741,11.3318076923077,13.132273830156,6.16003995082975,11.59114820435,10.9573192090395,15.5945,11.5245,12.0249,6.3186,13.744,11.0921
),.Dim = c(10L,.Dimnames = list(c(
"1","5","6","7","8","9","10"
),"b"))
)
conv_hull_1 <- convhulln( data_a,options = "FA") # Draw Convex Hull
#Make a big data_b
for (i in 1:15) {
data_b = rbind(data_b,data_b)
}
In_Or_Out <- inhulln(conv_hull_1,data_b)
result <- data.frame(data_b) %>% bind_cols(InOrOut=In_Or_Out)
我使用 dplyr::bind_cols
将输入或输出结果绑定到原始数据的数据框版本,因此您可能需要针对您的特定环境进行一些更改。