限制分层数据的大小以获得可重现的示例

我试图为这个问题提出可重复的例子(RE):
Errors related to data frame columns during merging.要被认定为有RE,这个问题只缺少可重复的数据.但是,当我尝试使用相当标准的dput方法(head(myDataObj))时,产生的输出是14MB大小的文件.问题是我的数据对象是数据帧列表,因此head()限制似乎不会递归地工作.

我没有找到dput()和head()函数的任何选项,这些函数允许我递归地控制复杂对象的数据大小.除非我在上面做错了,在这种情况下你会建议我创建最小RE数据集的其他方法吗?

最佳答案 根据@ MrFlick关于使用lapply的注释,您可以根据需要使用任何一系列函数来执行头函数或样本函数,以减小RE的大小和测试目的(我发现使用大型数据集的子集或子样本对于调试甚至图表来说是首选.

应该注意的是,头部和尾部提供结构的第一个或最后一个比特,但是为了RE目的,它们有时在它们中没有足够的方差,并且当然不是随机的,这是样本可能变得更有用的地方.

假设我们有一个分层树结构(列表的列表……),我们希望在保留树中的结构和标签的同时对每个“叶子”进行子集化.

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)

您可以通过以下方式在递归应用中使用默认头:

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 )

以下获取每个叶子的随机样本排序:

# 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" )
点赞