在不同长度的组内生成序列号(1,1,1,2,2,2,3,3,3)

时间:2017-08-03 07:02:41

标签: r sequence seq

我有一个带有列" Tag"的数据框,这里有四个不同的级别。我需要帮助来创建" Seq"列,从"标记生成的序列"专栏:

df <- data.frame(Tag = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
                 Seq = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3 )

每个&#34; Tag&#34;应划分为由&#34; Seq&#34;定义的3个子组。我们需要生成1,2和3的运行,其总长度为每个&#34;标记&#34;。因此,每次运行1,2和3的长度分别取决于每个&#34; Tag&#34;的长度。

注意每个长度&#34;标记&#34;不同。例如,标签1的长度为31,并且具有&#34; Seq&#34; 101102次,113次。

2 个答案:

答案 0 :(得分:1)

首先,标签1为31而标签2为32.查看下面的代码,第一个数字(1)的长度始终小于下一个数字(2,3)。我使用天花板工艺来提出这个问题。如果数字是例如31/3,那么代码应该做什么没有明确的标准..它应该给出10,10,11的长度吗?甚至9,11,11会好吗?代码给出了9,11,11长度:

 ec=table(Tag)
 unlist(mapply(function(x,y)rep(c(1,2,3),c(x,y,y)),ec-2*ceiling(ec/3),ceiling(ec/3)))

要检查输出结果,请将结果保存在变量中。d=mapply(... 然后做sapply(d,table)。 希望这会有所帮助。

答案 1 :(得分:1)

ave(Tag, Tag, FUN = function(x){sort(rep(x = 1:3, length.out = length(x)))})

说明:对于每个级别的&#34;标记&#34; (ave(Tag, Tag, ...):rep吃掉每一级&#34; Seq&#34; (x = 1:3)到&#34; Tag&#34;的子集长度(length.out = length(x))。 sort数字。