Выполнение convhulln в lapply () - PullRequest
0 голосов
/ 06 мая 2020

У меня есть следующий список фреймов данных:

> head(data)
[[1]]
           x        y        z Subject_id Gender Points
37 -51.03725 63.31324 69.57604     010037 female     36
38 -44.30373 69.68717 80.75729     010037 female     37
39 -32.74437 70.62483 83.41063     010037 female     38
40 -24.88931 64.95135 79.86515     010037 female     39
41 -32.68951 62.78665 81.20307     010037 female     40
42 -43.83451 62.00020 76.79511     010037 female     41

[[2]]
           x        y        z Subject_id Gender Points
37 -42.40363 74.87772 89.73664     010038 female     36
38 -35.17711 79.53899 97.64566     010038 female     37
39 -25.42336 79.82630 95.88161     010038 female     38
40 -20.39284 73.86760 93.54654     010038 female     39
41 -26.15917 72.41761 95.42335     010038 female     40
42 -35.75043 72.36721 94.50107     010038 female     41

[[3]]
            x        y          z Subject_id Gender Points
37 -33.835994 56.34955   85.25513     010042 female     36
38 -26.266633 61.52735   93.35376     010042 female     37
39 -19.104817 75.74637 -110.91817     010042 female     38
40  -9.997995 55.43769   83.74730     010042 female     39
41 -15.616716 53.01802   87.66035     010042 female     40
42 -25.804793 52.82884   87.54602     010042 female     41

[[4]]
           x        y        z Subject_id Gender Points
37 -50.05883 55.95437 70.65516     010043 female     36
38 -41.81110 61.75106 85.70794     010043 female     37
39 -29.91321 61.91256 93.27612     010043 female     38
40 -23.21436 55.91954 82.15154     010043 female     39
41 -30.38769 54.26515 83.14177     010043 female     40
42 -41.49120 54.18793 79.82122     010043 female     41

[[5]]
           x        y        z Subject_id Gender Points
37 -52.75432 60.75892 73.13308     010051 female     36
38 -46.52436 65.90073 84.42021     010051 female     37
39 -36.68530 67.78392 87.50159     010051 female     38
40 -30.27536 63.37142 83.67307     010051 female     39
41 -36.21967 61.08486 87.79969     010051 female     40
42 -46.04078 59.67538 82.71412     010051 female     41

Я хочу рассчитать объем выпуклой оболочки для каждого фрейма данных, используя lapply.

library(geometry)    
vols <- lapply(data, function(x) convhulln(matrix(x[, c("x", "y", "z")]), output.options = TRUE)$vol)

Но R выдал ошибку: Error in storage.mode(p) <- "double" : 'list' object cannot be coerced to type 'double'.

Однако, когда я запускал только фрейм данных, он работал нормально.

convhulln(data[[1]][, c("x", "y", "z")], output.options = TRUE)$vol

Я предполагаю, что lapply нарушает структуру data, но я не знаю, как это исправить. Помощь ??

1 Ответ

1 голос
/ 06 мая 2020

Думаю, вам не нужно там конвертировать в matrix. (даже если вы используете as.matrix, а не matrix, зная, что он изменит числа на символы).

Поскольку вам нужно только значение vol, рассмотрите sapply

library(geometry)
sapply(data, function(x) 
             convhulln(x[, c("x", "y", "z")], output.options = TRUE)$vol)

данные

data <- list(structure(list(x = c(-51.03725, -44.30373, -32.74437, -24.88931, 
-32.68951, -43.83451), y = c(63.31324, 69.68717, 70.62483, 64.95135, 
62.78665, 62.0002), z = c(69.57604, 80.75729, 83.41063, 79.86515, 
81.20307, 76.79511), Subject_id = c(10037L, 10037L, 10037L, 10037L, 
10037L, 10037L), Gender = c("female", "female", "female", "female", 
"female", "female"), Points = 36:41), class = "data.frame", row.names = c("37", 
"38", "39", "40", "41", "42")), structure(list(x = c(-51.03725, 
-44.30373, -32.74437, -24.88931, -32.68951, -43.83451), y = c(63.31324, 
69.68717, 70.62483, 64.95135, 62.78665, 62.0002), z = c(69.57604, 
 80.75729, 83.41063, 79.86515, 81.20307, 76.79511), Subject_id = c(10037L, 
10037L, 10037L, 10037L, 10037L, 10037L), Gender = c("female", 
"female", "female", "female", "female", "female"), Points = 36:41), 
class = "data.frame", row.names = c("37", "38", "39", "40", "41", "42")))
...