Платформа зенда: Как удалить строку таблицы, где несколько вещей верны?

Функция ниже использует рекурсию для построения вектора с длинами каждой группы. Это быстрее, чем цикл для небольших векторов данных (длина меньше, чем около ста значений), но медленнее для более длинных. Он принимает три аргумента:

1) vec: вектор значений, которые мы хотим сгруппировать.

2) i: индекс начальной позиции в vec.

3) glv: вектор групповых длин. Это возвращаемое значение, но нам нужно его инициализировать и передать через каждую рекурсию.

# Group a vector based on consecutive values with a cumulative sum <= 10
gf = function(vec, i, glv) {

  ## Break out of the recursion when we get to the last group
  if (sum(vec[i:length(vec)]) <= 10) {
    glv = c(glv, length(i:length(vec)))
    return(glv)
  }

  ## Keep recursion going if there are at least two groups left
  # Calculate length of current group
  gl = sum(cumsum(vec[i:length(vec)]) <= 10)

  # Append to previous group lengths
  glv.append = c(glv, gl)

  # Call function recursively 
  gf(vec, i + gl, glv.append)
}

Выполнить функцию для возврата вектора длины группы:

group_vec = gf(df$value, 1, numeric(0))
[1] 2 2 2 3 2 3 1

Чтобы добавить столбец к df с длинами групп, используйте rep:

df$group10 = rep(1:length(group_vec), group_vec)

. В его текущей форме функция будет работать только на векторах, которые не имеют значений больше 10 , и группировка суммами & lt; = 10 жестко кодируется. Разумеется, эту функцию можно обобщить, чтобы справиться с этими ограничениями.

Функция может быть несколько ускорена путем выполнения кумулятивных сумм, которые смотрят в будущее только на определенное количество значений, а не на оставшуюся длину вектора. Например, если значения всегда положительны, вам нужно только посмотреть десять значений вперед, так как вам не нужно будет суммировать более десяти чисел, чтобы достичь значения 10. Это тоже может быть обобщено для любого целевого значения. Даже с этой модификацией функция все еще медленнее, чем петля для вектора с более чем сотней значений.

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

24
задан Andrew 4 December 2009 в 06:05
поделиться

2 ответа

Продолжая ответ Джейсона У:

Не совсем уверен, что говорит 3-й раздел

Это означает, что вы можете сделать это:

$db->delete('tablename', array(
    'first_id = ?' => $first_id,
    'second_id = ?' => $second_id
));

Адаптер процитирует все для вас.

Я не чувствую, что документация очень ясна.

58
ответ дан smack0007 16 October 2019 в 07:46
поделиться

Из руководства zend по delete ():

Если вы опустите второй аргумент, в результате все строки в таблица базы данных удаляется.

Если вы предоставите массив строк как второй аргумент, эти строки объединились как термины в выражение, разделенное операторами AND.

Если вы предоставите массив массивов как второй аргумент, значения будут автоматически добавлены в кавычки ключи. Затем они будут объединены вместе как термины, разделенные AND

Не совсем уверен, что говорится в 3-м разделе, но 2-й подразумевает, что вы можете делать:

$where = array();
$where[] = $db->quoteInto('first_id = ?', $first_id);
$where[] = $db->quoteInto('second_id = ?', $second_id);
$db->delete('tablename', $where);
20
ответ дан 28 November 2019 в 22:21
поделиться
Другие вопросы по тегам:

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