我想在R中计算数百个凸包体积,而不必为每一次计算创建单独的数据帧。
下面是一个简化的示例:我目前有一个数据框架df,包含3列:Group、X、Y。
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中的每个变量,我想从X和df中的Y数据中计算出凸包体积。每个Group变量都有不同长度的x,y点。计算这些卷的长期方法是为每个data.frames分别设置Group。例如:
Frank.frame<-cbind(df$X[df$Group=="Frank"],df$Y[df$Group=="Frank"])然后根据这些数据计算出凸包体积。
library(geometry)
convhulln(Frank.frame, option="FA")$vol我的问题是:我是否可以使用原始的convhulln执行所有的df计算,或者是否需要分别分析这些单独的Groups?
我已经尝试循环这个,虽然我没有确定个别的分组,而是得到总的凸起船体体积。
for(i in 1:length(unique(df$Group))){
z[i]<-convhulln(cbind(df$X,df$Y),option="FA")$vol
}发布于 2016-03-18 20:37:50
不要在已经属于该类的项上使用as.numeric()。只是把列的名字弄乱了。这是在lapply数据中使用split的标准方法:
> 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发布于 2016-03-22 11:51:12
使用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 https://stackoverflow.com/questions/36092595
复制相似问题