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

时间:2014-08-04 20:29:53

标签: r dataset reproducible-research

我正在尝试为此问题提出可重现的示例(RE)Errors related to data frame columns during merging。要被认定为具有RE,该问题仅缺少可再现数据。但是,当我尝试使用dput(head(myDataObj))的几乎标准方法时,产生的输出是14MB大小的文件。问题是我的数据对象是数据框列表,因此head()限制似乎不能递归

我没有找到dput()head()函数的任何选项,这些函数允许我以递归方式控制复杂对象的数据大小。除非我上面的错误,否则你会在这种情况下推荐我,其他接近来创建一个最小的 RE数据集

1 个答案:

答案 0 :(得分:2)

根据@ MrFlick关于使用lapply的评论,您可以使用任何apply系列函数来执行headsample函数,具体取决于您的需要为了减少 RE 的大小和测试目的(我发现使用大型数据集的子集或子样本更适合于调试甚至图表)。

应该注意的是headtail提供了结构的第一位或最后一位,但有时它们在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" )