2016-03-18 2 views
0

Я хотел бы рассчитать сотни выпуклых объемов корпуса в R, не создавая отдельные кадры данных для каждого расчета.Вычисление множества выпуклых объемов корпуса с использованием convhulln в 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 и Y данных в df. Каждая переменная 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 
    } 

ответ

2

Не используйте as.numeric() для элементов thaat уже этого класса. Это просто испортит имена столбцов. Это стандартный подход к использованию lapply на split dataframe:

> 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 
1

Используя 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 
Смежные вопросы