Как мне найти количество групп 0 в нескольких бинарных фреймах данных в списке? - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь вывести количество групп по 0 в нескольких фреймах данных в списке. Я считаю, что пакет, который мне нужен, это растровый пакет R. Вот моя попытка ...

set.seed(12345)
output_1 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
df_output_1 <- data.frame(output_1)

set.seed(99999)
output_2 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
df_output_2 <- data.frame(output_2)

output_list <- list(df_output_2, df_output_2)

install.packages("raster")
library(raster)

lapply(output_list, function (onedf) {
  Rastermat <- raster(onedf)
  Clumps <- as.matrix(clump(Rastermat, directions = 8))

  #turning the clumps into a list
  tot <- max(Clumps, na.rm=TRUE)
  res <- vector("list", tot)
  for (i in 1:tot){
    res[i] <- list(which(Clumps == i, arr.ind = TRUE))
  }
  res
})

Но я получаю следующую ошибку:

Ошибка в .local (x, ...): в списке нет "x"

stop ("список не имеет \" x \ "")

.local (x, ...)

растр (onedf)

растр (onedf)

FUN (X [[i]], ...)

1.lapply (df_list, function (onedf) {

Rastermat <- растр (onedf) </p>

Clumps <- as.matrix (clump (Rastermat,directions = 8)) </p>

tot <- max (Clumps, na.rm = TRUE) ... </p>

Может кто-нибудь помочь мне? Я действительно застрял в том, что делать.

1 Ответ

1 голос
/ 03 ноября 2019

Единственная проблема заключается в том, что вам нужно использовать матрицы вместо data.frames.

Это должно работать:

library(raster)
set.seed(12345)
output_1 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
set.seed(99999)
output_2 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)

output_list <- list(output_2, output_2)

lapply(output_list, function (onedf) {
  Rastermat <- raster(onedf)
  Clumps <- as.matrix(clump(Rastermat, directions = 8))
  tot <- max(Clumps, na.rm=TRUE)
  res <- vector("list", tot)
  for (i in 1:tot){
    res[i] <- list(which(Clumps == i, arr.ind = TRUE))
  }
  res
})

ПРАВКА, чтобы ответить на ваши дополнительные вопросы:

При условии ваши входные данные представляют собой data.frames, содержащие 0s и 1s , и вы хотите подсчитать количество скоплений 0s , вы можете использовать следующий код, чтобы получить список из числасгустки в каждом data.frame:

sapply(list_of_dfs, function(df) {
  rm <- raster(as.matrix(df)-1) # -1 because the clump function counts non-zero values
  rc <- clump(rm, directions = 8, gaps = F) # gaps = F to prevent having missing numbers in the chunk numbers
  rc@data@max # return the highest chunk number
})
...