довольно простой запрос. Попробуйте следующее:
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: повторное чтение вопроса. Я не уверен, что вопрос требует «жить» на функции редактирования или функции (например, выше) применять после ввода данных ... Мне это не очень понятно ... поэтому не стесняйтесь быть более точными, если это необходимо;)
Если имеется только два вложенных элемента 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
})
. Я бы сказал, что жизнь будет проще, если вы реструктурируете свои данные, а затем используйте 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
Поскольку у вас есть два уровня списков для организации кадров данных, для этого потребуется функция применения вложенного списка (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, поэтому не нужно устанавливать и изучать новые пакеты.