Как использовать 'lapply' в Sublists (r) - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь использовать lapply в списке подсписков.Однако все, что я могу сделать, это переписать подсписки с тем, что должно входить в них, а не записывать в подсписки.

Чтобы прояснить мою проблему до точки скуки, это было бы то же самое, что иметь 'Список магазинов », с« DIY Store »и« Gardening Store ».Попытка вписать «Молоток и гвозди» в подсписок «Сделай сам» и «Семена» в подсписок «Садоводство», но понимая, что ты на самом деле нацарапал все свои предметы в «Список покупок», уничтожив свои подсписки.

Я думаю, что естьпростой способ сказать R: "Ого, просто рекурсивно посмотри на мой первый слой подсписков".В надежде, что это простое исправление, а более широкий контекст не слишком полезен, мой приятный раздел и то, где я думаю, что изменения должны быть сделаны, чуть ниже.

# Create a list of Types and the matrices
StatMatrices <- lapply(Types, function(q) {
    # Select Versus List so that for example, a HESH list only contains HESHVersusHEAT<
    # HESHVerusHESH, HESHVersusAPDS and HESHVersusAPDR, and not HEATVersus.. and so on...
    WhichVersus <- grep(paste0("(^", q, ")"), VersusList, value = T, perl = T)
    EmptySublist <- (setNames(vector("list", length(Types)), WhichVersus))
  })
names(StatMatrices) <- Types

Теперь я попробовалнекоторые вещи, такие как удвоение lapply, но я даже не уверен, что делаю это правильно, не говоря уже о том, чтобы найти правильное решение.

# Create a list of Types and the matrices
StatMatrices <- lapply(Types,
                       lapply, function(q) {
    # Select Versus List so that for example, a HESH list only contains HESHVersusHEAT<
    # HESHVerusHESH, HESHVersusAPDS and HESHVersusAPDR, and not HEATVersus.. and so on...
    WhichVersus <- grep(paste0("(^", q, ")"), VersusList, value = T, perl = T)
    EmptySublist <- (setNames(vector("list", length(Types)), WhichVersus))
  })
names(StatMatrices) <- Types

Мой полный код показан ниже.Я пытался это прокомментировать, но по сути у меня есть 4 «Типа», и я создаю списки с именем StatMatrices.Это будет содержать дополнительные списки, следующий слой будет состоять из имен, таких как, например, VelStatMatrices, имена в соответствии с последующей информацией, которая будет храниться в них.Следующим набором списков будут так называемые типы (например, HEAT, HESH, APDS и APCR).Они будут содержать матрицы сравнения, хотя на данный момент это только названия местозаполнителей.Таким образом, внутри HESH вы будете иметь HESHVersusHEAT HESHVerusHESH, HESHVersusAPDS и HESHVersusAPDR, ожидающие заполнения матрицы.

Окончательный путь к списку будет выглядеть примерно так:

StatMatrices[["VelStatMatrices"]][[HESH]][[HESHVerusHEAT]]

и другой подобный

StatMatrices[["PenStatMatrices"]][["APDS"]][["APDSVerusHESH"]]

Вот что у меня так далеко:

#Mun Types
Types = c("HEAT", "HESH", "APDS", "APCR")

#Create empty vector for Versus name strings
VersusList <- c()

#Create Versus names e.g. HEATVerusAPDS and APCRVersusHESH etc
for (q in 1:length(Types)) {
  for (j in 1:length(Types)) {

    # VersusList(i) <- paste0(Types[q], "Versus", Types[j])
    VersusList <- c(VersusList, paste0(Types[q], "Versus", Types[j]))
  }
}

#Create List of lists of stat matrices, each to be filled with matrices,  
StatMatrices <- list("PenStatMatrices", "DmgStatMatrices", "VelStatMatrices")

# Create a list of Types and the matrices
StatMatrices <- lapply(Types, function(q) {
    # Select Versus List so that for example, a HESH list only contains HESHVersusHEAT<
    # HESHVerusHESH, HESHVersusAPDS and HESHVersusAPDR, and not HEATVersus.. and so on...
    WhichVersus <- grep(paste0("(^", q, ")"), VersusList, value = T, perl = T)
    EmptySublist <- (setNames(vector("list", length(Types)), WhichVersus))
  })
names(StatMatrices) <- Types

Я только начинаю использовать lapply и почти не знаю, что делаю с R, поэтому любая помощь будет принята.

1 Ответ

1 голос
/ 19 апреля 2019

Извините, что не предоставил более конкретного ответа на данный момент (может быть, немного более краткий вопрос поможет), но я бы порекомендовал взглянуть на utils::modifyList(). Кажется, что это может помочь.

Кроме того, глядя на ваш вариант использования, вы можете немного сэкономить, структурируя объекты немного по-другому, один пример - матрица матриц:

Создайте матрицу 4x4 из 4x4 матриц (из случайных чисел для показа):

mtr <- matrix(
  rep(list(matrix(runif(16L), nrow = 4L)), 16L),
  nrow = 4,
  ncol = 4
)

Установите имена строк и столбцов для лучшей читаемости

rownames(mtr) <- colnames(mtr) <-  c("HEAT", "HESH", "APDS", "APCR")

А затем получить доступ к данным следующим образом:

mtr["HEAT", "HEAT"]

что дает

[[1]]
            [,1]      [,2]      [,3]      [,4]
[1,] 0.413062588 0.2497092 0.6465910 0.9492033
[2,] 0.007168949 0.9049881 0.1491240 0.1494439
[3,] 0.540454187 0.4837212 0.2674728 0.6261278
[4,] 0.327341522 0.9747880 0.7509647 0.5489474

И у вас есть список матриц, так что вы можете легко применять функции:

lapply(mtr, summary)

Возвращение (усечено):

[[1]]
       V1                 V2               V3               V4        
 Min.   :0.007169   Min.   :0.2497   Min.   :0.1491   Min.   :0.1494  
 1st Qu.:0.247298   1st Qu.:0.4252   1st Qu.:0.2379   1st Qu.:0.4491  
 Median :0.370202   Median :0.6944   Median :0.4570   Median :0.5875  
 Mean   :0.322007   Mean   :0.6533   Mean   :0.4535   Mean   :0.5684  
 3rd Qu.:0.444910   3rd Qu.:0.9224   3rd Qu.:0.6727   3rd Qu.:0.7069  
 Max.   :0.540454   Max.   :0.9748   Max.   :0.7510   Max.   :0.9492  

[[2]]
       V1                 V2               V3               V4        
 Min.   :0.007169   Min.   :0.2497   Min.   :0.1491   Min.   :0.1494  
 1st Qu.:0.247298   1st Qu.:0.4252   1st Qu.:0.2379   1st Qu.:0.4491  

...
...