在R或SQL中进行分段

Tur*_*ime 6 sql sql-server oracle r bucket-sort

我完全被一个问题困扰,并希望得到一些指导.我从1到8的集合中挑选8个数字的随机集合(例如,5,6,8,1,3,4,2,7)并尝试根据顺序将这些数字作为连续数字的子集他们出现了.

对于上面的示例,第一个桶将以5开始,然后将添加6.点击8时,将启动一个新的桶.每当我们找到属于现有存储桶的数字时(例如,当我们到达时2,它可以添加到1存储桶中),我们将其添加到那里.在这个例子中,在我们到达的所有8个数字之后:

5,6,7
8
1,2
3,4
Run Code Online (Sandbox Code Playgroud)

总共4个水桶.

我实际上并不关心桶的内容,我只想计算给定的8位数字随机数的桶数.我计划循环遍历这些8位数序列中的1000个.

pic*_*ick 5

如果您只对桶的数量感兴趣,

## Your data
dat <- c( 5,6,8,1,3,4,2,7)

## Get the number of buckets
count <- 0
for (i in seq_along(dat))
    if (!((dat[i] - 1) %in% dat[1:i])) count <- count+1
count
# 4
Run Code Online (Sandbox Code Playgroud)

而且,功能更简洁

countBuckets <- function(lst) sum(sapply(1:length(lst), function(i)
    (!((lst[i]-1) %in% lst[1:i]))))
Run Code Online (Sandbox Code Playgroud)

并且,这是一个获取存储桶内容的递归实现.

f <- function(lst, acc=NULL) {
    if (length(lst) == 0) return(acc)
    if (missing(acc)) return( Recall(lst[-1], list(lst[1])) )

    diffs <- sapply(acc, function(x) lst[1] - x[length(x)] == 1)
    if (any(diffs)) {
        acc[[which(diffs)]] <- c(acc[[which(diffs)]], lst[1])
    } else { acc <- c(acc, lst[1]) }
    return ( Recall(lst[-1], acc) )
}

f(dat)

# [[1]]
# [1] 5 6 7
# 
# [[2]]
# [1] 8
# 
# [[3]]
# [1] 1 2
# 
# [[4]]
# [1] 3 4
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有得到应有的赞赏 (2认同)

jan*_*cki 5

我的解决方案,不是从nongkrong撕裂,但非常相似.你得到了桶的数量:

x <- as.integer(c(5,6,8,1,3,4,2,7))
sum(is.na(sapply(1:length(x), function(i) which((x[i]-1L)==x[1:i])[1L])))
# [1] 4
Run Code Online (Sandbox Code Playgroud)

我相信可以对其进行矢量化,然后它可以完美地扩展.


Bri*_*ian 2

我对 R 不太熟悉,但你绝对可以这样做:

setOf8 = your array of 8 numbers
buckets=0
for( i = [2,8] )
{
    if( (setOf8[i] < setOf8[i-1]) )
    {
        buckets = buckets + 1
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

你可以这样做:

func countBuckets( buckets, set )
{
    set = your array
    current = 1
    for( i = [2,size(set)] )
    {
        if( set[current] + 1 == set[i] )
        {
            set.remove( current )
            current = set[i-1]
        }
    }
    if( size(set) == 0 )
    {
        return buckets
    }
return countBuckets( buckets + 1, set )
}
Run Code Online (Sandbox Code Playgroud)