首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用R中的凸包法计算多个凸包体积

用R中的凸包法计算多个凸包体积
EN

Stack Overflow用户
提问于 2016-03-18 19:16:14
回答 2查看 907关注 0票数 0

我想在R中计算数百个凸包体积,而不必为每一次计算创建单独的数据帧。

下面是一个简化的示例:我目前有一个数据框架df,包含3列:GroupXY

代码语言:javascript
复制
Group<-c(rep("Frank",times=6),rep("Greg",times=11),rep("Stacy",times=3),rep("Nancy",times=10))
X<-c(4,5,3,5,7,4,8,23,4,7,5,2,8,5,8,3,6,5,4,6,8,9,2,5,8,3,6,3,3,4)  
Y<-c(7,9,3,6,4,8,7,8,6,3,2,3,6,7,4,6,8,9,5,7,8,9,6,5,4,6,7,8,3,6)
df<-data.frame(Group,as.numeric(X),as.numeric(Y))

对于Group中的每个变量,我想从Xdf中的Y数据中计算出凸包体积。每个Group变量都有不同长度的x,y点。计算这些卷的长期方法是为每个data.frames分别设置Group。例如:

代码语言:javascript
复制
Frank.frame<-cbind(df$X[df$Group=="Frank"],df$Y[df$Group=="Frank"])

然后根据这些数据计算出凸包体积。

代码语言:javascript
复制
library(geometry)
convhulln(Frank.frame, option="FA")$vol

我的问题是:我是否可以使用原始的convhulln执行所有的df计算,或者是否需要分别分析这些单独的Groups

我已经尝试循环这个,虽然我没有确定个别的分组,而是得到总的凸起船体体积。

代码语言:javascript
复制
    for(i in 1:length(unique(df$Group))){ 
             z[i]<-convhulln(cbind(df$X,df$Y),option="FA")$vol
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-18 20:37:50

不要在已经属于该类的项上使用as.numeric()。只是把列的名字弄乱了。这是在lapply数据中使用split的标准方法:

代码语言:javascript
复制
> df<-data.frame(Group,X,Y)
> lapply( split( df, df$Group), 
          function (d) convhulln(data.matrix(d[ , c("X","Y")]), option="FA")$vol )
$Frank
[1] 13

$Greg
[1] 64

$Nancy
[1] 29.5

$Stacy
[1] 3
票数 3
EN

Stack Overflow用户

发布于 2016-03-22 11:51:12

使用purrr包,我们也可以这样做,避免使用匿名函数:

代码语言:javascript
复制
df <- data.frame(Group,X,Y)

library(purrr)
df %>% 
  split(.$Group) %>% 
  map(~ as.matrix(.[ , c("X","Y")])) %>%
  map(~ convhulln(., option="FA")) %>% 
  map_dbl("vol")

Frank  Greg Nancy Stacy 
 13.0  64.0  29.5   3.0 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36092595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档