Ограничение размера иерархических данных для воспроизводимого примера

Я пытаюсь придумать воспроизводимый пример (RE) для этого вопроса: Ошибки, связанные с столбцами фрейма данных при слиянии. Чтобы быть квалифицированным как обладающий RE, вопрос не содержит только воспроизводимых данных. Тем не менее, когда я пытался использовать довольно стандартный подход dput(head(myDataObj)), выходной файл 14MB. Проблема в том, что мой объект данных представляет собой список кадров данных, поэтому ограничение head() не работает рекурсивно.

Я не нашел никаких параметров для функций dput() и head(), которые позволили бы мне рекурсивно управлять размером данных для сложных объектов. Если я не ошибаюсь в приведенном выше вопросе, что другие подходят к созданию минимального набора данных RE, вы бы порекомендовали меня в этой ситуации?

Ответы

Ответ 1

Вдоль строк комментария @MrFlick использования lapply вы можете использовать любое из семейств функций apply для выполнения функций head или sample в зависимости от ваших потребностей, чтобы уменьшить размер для как RE, так и для тестирования (я обнаружил, что работа с подмножествами или подвыборками больших наборов данных предпочтительнее для отладки и даже построения диаграмм).

Следует отметить, что head и tail предоставляют первый или последний бит структуры, но иногда они не имеют достаточной дисперсии в них для целей RE и, конечно, не являются случайными, то есть где sample может стать более полезным.

Предположим, что у нас есть иерархическая древовидная структура (список списков...), и мы хотим подмножать каждый "лист", сохраняя структуру и метки в дереве.

x <- list( 
    a=1:10, 
    b=list( ba=1:10, bb=1:10 ), 
    c=list( ca=list( caa=1:10, cab=letters[1:10], cac="hello" ), cb=toupper( letters[1:10] ) ) )

ПРИМЕЧАНИЕ. Ниже я не могу сказать разницы между использованием how="replace" и how="list".

ТАКЖЕ ПРИМЕЧАНИЕ: Это не будет отлично для data.frame листовых узлов.

# Set seed so the example is reproducible with randomized methods:
set.seed(1)

Вы можете использовать по умолчанию head в рекурсивном применении следующим образом:

rapply( x, head, how="replace" )

Или передайте анонимную функцию, которая изменяет поведение:

# Complete anonymous function
rapply( x, function(y){ head(y,2) }, how="replace" )
# Same behavior, but using the rapply "..." argument to pass the n=2 to head.
rapply( x, head, how="replace", n=2 )

Следующее получает рандомизированное упорядочение sample каждого листа:

# This works because we use minimum in case leaves are shorter
# than the requested maximum length.
rapply( x, function(y){ sample(y, size=min(length(y),2) ) }, how="replace" )

# Less efficient, but maybe easier to read:
rapply( x, function(y){ head(sample(y)) }, how="replace" )  

# XXX: Does NOT work The following does **not** work 
# because `sample` with a `size` greater than the 
# item being sampled does not work (when 
# sampling without replacement)
rapply( x, function(y){ sample(y, size=2) }, how="replace" )