我在这里看到了许多“将向量X分成Y个块”的变化形式的问题。例如:这里和这里,都是其中两个例子。所以,当我意识到我需要将一个向量分成Y个大小随机的块时,我很惊讶地发现随机性要求可能是“新的”——我找不到在这方面的方法。
因此,这里是我的想法:
因此,这里是我的想法:
k.chunks = function(seq.size, n.chunks) {
break.pts = sample(1:seq.size, n.chunks, replace=F) %>% sort() #Get a set of break points chosen from along the length of the vector without replacement so no duplicate selections.
groups = rep(NA, seq.size) #Set up the empty output vector.
groups[1:break.pts[1]] = 1 #Set the first set of group affiliations because it has a unique start point of 1.
for (i in 2:(n.chunks)) { #For all other chunks...
groups[break.pts[i-1]:break.pts[i]] = i #Set the respective group affiliations
}
groups[break.pts[n.chunks]:seq.size] = n.chunks #Set the last group affiliation because it has a unique endpoint of seq.size.
return(groups)
}
我的问题是:这种方法是否不够优雅或者效率不高?在我计划的代码中,它会被调用数千次,因此效率对我很重要。最好避免使用for
循环或手动设置第一个和最后一个组。我的另一个问题是:是否存在可以破坏这个方法的逻辑输入?我知道n.chunks
不能大于seq.size
,所以我的意思是除此之外的问题。
n.chunks
,您的代码应该足够快。 - F. Privébreak.pts[i-1]:break.pts[i]
),而最后一组与前一组具有相同的分配。 - F. Privésort(sample(1:length(vector), sample(1:length(n.chunks( ie, vector again), replace = FALSE), replace= FALSE))
中,除非你可以扔进一个seq
。 - Chrissort
会影响你的执行时间。我能想到的最简单的代码是sort(sample(1:n.chunks, seq.size, replace = TRUE))
。但实际上这会变得相当慢(相对而言)。 - user10917479