R 将表中因子的值洗牌

R 将表中因子的值洗牌,r,R,为glm使用一个包,该glm以块的形式读取数据帧。要求在每个区块中出现所有级别的因子。我正在寻找一个很好的策略来重新安排观察结果,以便最大限度地提高在每个数据块中拥有所有值的概率 例如 c(4,7,4,4,4,4,4,4,4,4,4,7,4,4,8,8,5,5) 对于大小为8的块,最好的重新排列是 c(4,7,5,8,4,4,4,4,4,4,4,7,4,4,8,8,4,5,8) 是否有一些优雅的方式来处理周围的数据 刚才看到了注释。这个库本身被称为bigglm(它以分块方式读取数据)。向量应

为glm使用一个包,该glm以块的形式读取数据帧。要求在每个区块中出现所有级别的因子。我正在寻找一个很好的策略来重新安排观察结果,以便最大限度地提高在每个数据块中拥有所有值的概率

例如

c(4,7,4,4,4,4,4,4,4,4,4,7,4,4,8,8,5,5)
对于大小为8的块,最好的重新排列是

c(4,7,5,8,4,4,4,4,4,4,4,7,4,4,8,8,4,5,8)
是否有一些优雅的方式来处理周围的数据

刚才看到了注释。这个库本身被称为bigglm(它以分块方式读取数据)。向量应为eqal lenegth。问题实际上只是重新安排大多数数据块中存在的大多数级别的数据

这里可以找到数据帧列的示例 ()


在这种情况下,最重要的是尽可能多的层次出现在尽可能多的块中。块越小,读入时所需的内存就越少。我认为最好假设10个数据块。

我想我理解您的要求,尽管我不熟悉按数据块读取数据并使用
stringsAsFactors=TRUE
的函数,同时对数据的组成进行先验假设(并且没有提供一种叠加其他因素特征的方法)。我提前提出建议,要么您误解了函数,要么您错误地将其应用于特定的数据问题

我在这样的问题上很容易出错,所以不管怎样,我将尝试解决推断出的问题

您声称函数将读取前8个元素,并对其进行处理。它必须知道有(在本例中)需要考虑四个因素;正如您所问的,最简单的方法是在每个块中都显示这些因素。一旦它处理完前8行,它将读取后8个元素。对于示例数据,这不起作用,因为后8个元素不包括5

我将在稍后定义稍微增加的数据来解决这个问题

假设/规则
  • 数据中整体唯一值的数量不得大于每个数据块的大小

  • 每个因素的出现次数必须至少与要读取的块数相同;以及

  • 除了最后一个块中的元素介于1和
    chunksize
    之间之外,所有块中都精确地包含
    chunksize
    元素(即,full);因此

  • 最后一个块的元素数量至少与唯一值的数量相同

函数定义 考虑到这些规则,这里有一些代码。这肯定不是唯一的解决方案,而且它可能无法很好地处理非常大的数据集(我没有做过广泛的测试)

(为了便于检查,在输出中添加了空格)。每个块的前四个元素是
4、7、5、8
,因此每个块中都包含所有因素

崩溃 快速演练(使用
debug(myfunc)
),假设
x=dat3
chunksize=8
。跳下代码:

## Browse[2]> uniqx
## [1] 4 7 5 8
## Browse[2]> allIndices
## [[1]]
## [1]  1  6  7  8  9 10 11 13 14
## [[2]]
## [1]  2  4 12
## [[3]]
## [1]  3 17 18 19 20
## [[4]]
## [1]  5 15 16
这显示了每个唯一元素的索引。例如,在索引1、6、7等处有4个

## Browse[2]> chunks
## [[1]]
## [1] 1 2 3 5
## [[2]]
## [1]  6  4 17 15
## [[3]]
## [1]  7 12 18 16
有三个块需要填充,此列表开始形成这些块。在本例中,我们在第一个块中放置了索引1、2、3和5。回顾
所有属性,您将看到它们代表每个
uniqx
的第一个实例,因此第一个块现在包含
c(4、7、5、8)
,以及其他两个块

此时,我们已经满足了在每个块中找到每个唯一元素的基本要求。代码的其余部分将填充剩余的元素

## Browse[2]> remainder
## [1]  8  9 10 11 13 14 19 20
这些都是迄今为止尚未添加到块中的索引

## Browse[2]> remainderCut
## $`1`
## [1]  8  9 10 11
## $`2`
## [1] 13 14 19 20
虽然我们有三个区块,但这里只有两个列表。这很好,我们没有(也不需要)添加到最后一个区块。然后我们将这些区块与
区块进行压缩合并,形成一个索引列表列表。(注意:您可能会尝试
mapply(函数(a,b)c(a,b),区块,remainderCut)
,但您可能会注意到,如果
remainderCut
的大小与
块的大小不同,正如我们在这里看到的,则其值会被回收。不可接受。请尝试。)


请记住,每个数字表示
x
中的索引(最初为
dat3
)。然后,我们将
取消列出该拆分向量,并将索引应用于数据。

如何定义块?此描述不太清楚。能否从软件包本身提供说明所需内容的文档?是否要随机排列数字?您可以使用
sample()进行此操作
你的第一个向量有18个值。你的第二个向量有19个值。这个问题真的没有很好的定义。块大小为8,长度为18会导致3个块。5、7和8各出现两次,不可能在所有的块中都有它们。虽然我想我理解你的需要,正如@Reed所建议的,你需要澄清一下你的问题。正如AnandaMahto所建议的,你也需要一个更好的。非常详细的…并且很有帮助。你能告诉我你的函数在不是每个值都可以出现在每个块中的情况下是否也能工作吗?我没有说得太清楚,但重点是用数据获得最佳的剥离。因此,增加每个l的数据级别不可能出现在每个块中。如果级别只出现两次,并且出现在第1行和第2行中(总共有3个块),那么至少要重新排列,使其出现在可能的最大数量的块中(两个)在这种情况下,我使用的输入是数据框中的一个factor列。但是,如果我尝试使用它运行you函数,它只会返回该框列中存在的所有不同级别。您是否尝试过
myfunc(mydf$column,8)
## Browse[2]> chunks
## [[1]]
## [1] 1 2 3 5
## [[2]]
## [1]  6  4 17 15
## [[3]]
## [1]  7 12 18 16
## Browse[2]> remainder
## [1]  8  9 10 11 13 14 19 20
## Browse[2]> remainderCut
## $`1`
## [1]  8  9 10 11
## $`2`
## [1] 13 14 19 20
## Browse[2]> finalIndices
## [[1]]
## [1]  1  2  3  5  8  9 10 11
## [[2]]
## [1]  6  4 17 15 13 14 19 20
## [[3]]
## [1]  7 12 18 16