Как перебрать список списков, в то время как поднаборы списков основаны на переменной

довольно простой запрос. Попробуйте следующее:

 function try_It(){
 deleteRow(2); //// choose col = 2 for column C
 }

 function deleteRow(col){ // col is the index of the column to check for 0 or empty
 var sh = SpreadsheetApp.getActiveSheet();
 var data = sh.getDataRange().getValues();
 var targetData = new Array();
 for(n=0;n<data.length;++n){
 if(data[n][col]!='' && data[n][col]!=0){ targetData.push(data[n])};
 }
 Logger.log(targetData);
 sh.getDataRange().clear();
 sh.getRange(1,1,targetData.length,targetData[0].length).setValues(targetData);
 }

EDIT: повторное чтение вопроса. Я не уверен, что вопрос требует «жить» на функции редактирования или функции (например, выше) применять после ввода данных ... Мне это не очень понятно ... поэтому не стесняйтесь быть более точными, если это необходимо;)

1
задан Krutik 29 March 2019 в 11:44
поделиться

3 ответа

Если имеется только два вложенных элемента list и требуются разные условия filter, примените к нему индивидуально и назначьте выход обратно элементу list. Проходим по мастеру list с помощью map, а затем применяем логические условия

library(purrr)
library(dplyr)
lst2 <- map(lst1, ~  {
       .x[[1]] <- .x[[1]] %>%
                       filter_at(4, all_vars(. > 6))
       .x[[2]] <- .x[[2]] %>%
                      filter_at(5, all_vars(. == 'y'))
         .x
    })
.
0
ответ дан akrun 29 March 2019 в 11:44
поделиться

Я бы сказал, что жизнь будет проще, если вы реструктурируете свои данные, а затем используйте dplyr filter, чтобы извлечь то, что вы хотите (или опустить то, что вы не хотите). Предполагая, что ваши исходные данные называются foo:

# Load libraries
library(dplyr)
library(purrr)

# Remove one list
bar <- unlist(foo, recursive = FALSE)

# Get names of campaigns and games
campaign_games <- data.frame(do.call(rbind, strsplit(names(bar), "\\.")))

# Add campaigns and games numbers to data frames
ls_games <- pmap(list(campaign_games[, 1], campaign_games[, 2], bar), cbind)

# Rename all columns
ls_games <-  lapply(ls_games, function(x){names(x) <- c("Campaign", "Game_n", "Class", "Race", "Alignment", "Level", "Alive"); x})

# Convert to data frame
df <- bind_rows(ls_games)

# Look at result
head(df)

Теперь ваши данные выглядят так:

#   Campaign Game_n    Class  Race Alignment Level Alive
# 1 FEB_gems  GAME1  paladin human        NE     6     y
# 2 FEB_gems  GAME1  fighter   elf        CG     7     y
# 3 FEB_gems  GAME1   wizard   orc        CE     6     y
# 4 FEB_gems  GAME1 sorcerer human        NN     7     y
# 5 FEB_gems  GAME1    rouge gnome        LG     7     y
# 6 FEB_gems  GAME2  fighter   elf        NE     5     n

, что легко обрабатывается. Например, вытащите тех, кто жив в игре 1 из драгоценных камней FEB и имеет уровень 7 или выше.

df %>% filter(Alive == "y", Campaign == "FEB_gems", 
              Level >= 7, Game_n == "GAME1")

#   Campaign Game_n    Class  Race Alignment Level Alive
# 1 FEB_gems  GAME1  fighter   elf        CG     7     y
# 2 FEB_gems  GAME1 sorcerer human        NN     7     y
# 3 FEB_gems  GAME1    rouge gnome        LG     7     y
0
ответ дан Lyngbakr 29 March 2019 в 11:44
поделиться

Поскольку у вас есть два уровня списков для организации кадров данных, для этого потребуется функция применения вложенного списка (lapply) - то же самое, что и цикл, но немного лучше. Вот пример, который создает функцию для поднабора списка игр (gameList) на основе максимального уровня (maxLevel):

listSubset <- function(x, maxLevel){
  lapply(x, function(ls){
    lapply(ls, function(df) df[df[[grep('Level', names(df), value = TRUE)]] < maxLevel, ])
  })
}
listSubset(x = gameList, maxLevel = 6)

Выход:

Поскольку у вас есть два уровня списков для организации кадров данных, для этого потребуется функция применения вложенного списка (lapply) - то же самое, что и цикл, но немного лучше. Вот пример, который создает функцию для поднабора списка игр (gameList) на основе максимального уровня (maxLevel):

[110]

Выход:

FEB_gems`

Поскольку у вас есть два уровня списков для организации кадров данных, для этого потребуется функция применения вложенного списка (lapply) - то же самое, что и цикл, но немного лучше. Вот пример, который создает функцию для поднабора списка игр (gameList) на основе максимального уровня (maxLevel):

[110]

Выход:

FEB_gems`

Поскольку у вас есть два уровня списков для организации кадров данных, для этого потребуется функция применения вложенного списка (lapply) - то же самое, что и цикл, но немного лучше. Вот пример, который создает функцию для поднабора списка игр (gameList) на основе максимального уровня (maxLevel):

[110]

Выход:

GAME1` [1] GAME1_Class GAME1_Race GAME1_Alignment GAME1_Level GAME1_Alive <0 rows> (or 0-length row.names)

Поскольку у вас есть два уровня списков для организации кадров данных, для этого потребуется функция применения вложенного списка (lapply) - то же самое, что и цикл, но немного лучше. Вот пример, который создает функцию для поднабора списка игр (gameList) на основе максимального уровня (maxLevel):

[110]

Выход:

FEB_gems`$GAME2 GAME2_Class GAME2_Race GAME2_Alignment GAME2_Level GAME2_Alive 1 fighter elf NE 5 n 2 wizard half-elf CG 5 y 3 cleric elf CE 5 y 4 monk human NN 5 y 5 bard dwarf LG 5 y $MAR_gems $MAR_gems

Поскольку у вас есть два уровня списков для организации кадров данных, для этого потребуется функция применения вложенного списка (lapply) - то же самое, что и цикл, но немного лучше. Вот пример, который создает функцию для поднабора списка игр (gameList) на основе максимального уровня (maxLevel):

[110]

Выход:

GAME3` GAME3_Class GAME3_Race GAME3_Alignment GAME3_Level GAME3_Alive 1 cleric elf LG 1 y 2 barbarian half-elf LG 1 y 3 warlock elf CE 1 y 4 ranger human LN 1 n 5 monk dwarf LG 1 y $MAR_gems$GAME4 GAME4_Class GAME4_Race GAME4_Alignment GAME4_Level GAME4_Alive 1 paladin elf CE 5 n 2 fighter half-elf CG 5 y 3 wizard elf CE 5 y 4 sorcerer human LN 5 y 5 rouge dwarf LG 5 y

Все функции находятся в базе R, поэтому не нужно устанавливать и изучать новые пакеты.

0
ответ дан Andrew Royal 29 March 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: