Преобразование большой матрицы в набор данных путем пропуска ряда строк [дубликат]

Версия PHP, вдохновленная версией C # Кейта Беллера.

PHP-версия bala не работала для меня, потому что мне не нужно было группировать числа. Мне нужна более простая реализация с одним целевым значением и пулом чисел. Эта функция также сократит любые повторяющиеся записи.

/**
 * Calculates a subset sum: finds out which combinations of numbers
 * from the numbers array can be added together to come to the target
 * number.
 * 
 * Returns an indexed array with arrays of number combinations.
 * 
 * Example: 
 * 
 * <pre>
 * $matches = subset_sum(array(5,10,7,3,20), 25);
 * </pre>
 * 
 * Returns:
 * 
 * <pre>
 * Array
 * (
 *   [0] => Array
 *   (
 *       [0] => 3
 *       [1] => 5
 *       [2] => 7
 *       [3] => 10
 *   )
 *   [1] => Array
 *   (
 *       [0] => 5
 *       [1] => 20
 *   )
 * )
 * </pre>
 * 
 * @param number[] $numbers
 * @param number $target
 * @param array $part
 * @return array[number[]]
 */
function subset_sum($numbers, $target, $part=null)
{
    // we assume that an empty $part variable means this
    // is the top level call.
    $toplevel = false;
    if($part === null) {
        $toplevel = true;
        $part = array();
    }

    $s = 0;
    foreach($part as $x) 
    {
        $s = $s + $x;
    }

    // we have found a match!
    if($s == $target) 
    {
        sort($part); // ensure the numbers are always sorted
        return array(implode('|', $part));
    }

    // gone too far, break off
    if($s >= $target) 
    {
        return null;
    }

    $matches = array();
    $totalNumbers = count($numbers);

    for($i=0; $i < $totalNumbers; $i++) 
    {
        $remaining = array();
        $n = $numbers[$i];

        for($j = $i+1; $j < $totalNumbers; $j++) 
        {
            $remaining[] = $numbers[$j];
        }

        $part_rec = $part;
        $part_rec[] = $n;

        $result = subset_sum($remaining, $target, $part_rec);
        if($result) 
        {
            $matches = array_merge($matches, $result);
        }
    }

    if(!$toplevel) 
    {
        return $matches;
    }

    // this is the top level function call: we have to
    // prepare the final result value by stripping any
    // duplicate results.
    $matches = array_unique($matches);
    $result = array();
    foreach($matches as $entry) 
    {
        $result[] = explode('|', $entry);
    }

    return $result;
}
6
задан lmo 2 May 2016 в 18:35
поделиться

2 ответа

Если вы хотите извлечь 5,10 ...

newdf <- df[c(rep(FALSE,4),TRUE), ]

Если 1,6,11,

newdf <- df[c(TRUE,rep(FALSE,4)), ]
4
ответ дан bartektartanus 19 August 2018 в 01:26
поделиться

Для фрейма данных df вы можете получить df.new как:

df.new = df[seq(1, nrow(df), 5), ]

. Это создает индекс из строки 1 в nrow (количество строк таблицы) каждые 5 строк. Вы можете играть с начальной точкой, а 5 - для выделения других последовательностей.

13
ответ дан user14382 19 August 2018 в 01:26
поделиться
Другие вопросы по тегам:

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