Как использовать ‘lapply’ в подсписках (r)

#r #list #loops #lapply #sublist

#r #Список #циклы #lapply #подсписок

Вопрос:

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

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

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

 # 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. Где VersusList (показано позже, но слишком много кода затрудняет поиск) ?! Не могли бы вы сделать свой пост более кратким?

Ответ №1:

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

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

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

 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  

...