我有一个带有列" 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; 10
次1
,10
次2
次,11
次3
次。
答案 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
数字。