【问题标题】:Calculating multiple convex hull volumes using convhulln in R在 R 中使用 convhulln 计算多个凸包体积
【发布时间】:2016-03-22 19:51:12
【问题描述】:

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

这是一个简化的示例:我目前有一个数据框 df,它有 3 列:GroupXY

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 中的每个变量,我想根据df 中的XY 数据计算凸包体积。每个Group 变量都有不同的x,y 点长度。我所做的计算这些卷的漫长路线是为每个Group 制作单独的data.frames。例如:

Frank.frame<-cbind(df$X[df$Group=="Frank"],df$Y[df$Group=="Frank"])

然后我根据该数据计算了凸包体积

library(geometry)
convhulln(Frank.frame, option="FA")$vol

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

我试图循环这个,但我无法识别各个分组,而是得到了总的凸包体积。

    for(i in 1:length(unique(df$Group))){ 
             z[i]<-convhulln(cbind(df$X,df$Y),option="FA")$vol
    }

【问题讨论】:

    标签: r loops geometry


    【解决方案1】:

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

    > 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
    

    【讨论】:

      【解决方案2】:

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

      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 
      

      【讨论】:

        猜你喜欢
        • 2018-06-23
        • 2020-02-16
        • 2016-09-21
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        • 2017-05-01
        • 2015-07-11
        • 2019-12-03
        相关资源
        最近更新 更多