Julia data.table rleid()函数的等效项

Julia data.table rleid()函数的等效项,julia,Julia,有人知道Julia可以使用的data.table::rleid()函数吗 我不知道任何库函数。但这里你有两个选择 将缺失的视为有效条目: 跳过缺失在输出向量中放置缺失: (在最后一个案例中,请注意,缺失被视为不存在——如果您想要一些不同的东西,可以很容易地调整行为) 的优点是这些函数将是快速的-不需要在C++中使用的外部库中实现它们。 < p>我不知道任何库函数。但这里你有两个选择 将缺失的视为有效条目: 跳过缺失在输出向量中放置缺失: (在最后一个案例中,请注意,缺失被视为不存在——如果您想要

有人知道Julia可以使用的data.table::rleid()函数吗


我不知道任何库函数。但这里你有两个选择

缺失的
视为有效条目:
跳过
缺失
在输出向量中放置
缺失
: (在最后一个案例中,请注意,
缺失
被视为不存在——如果您想要一些不同的东西,可以很容易地调整行为)


<朱丽亚>的优点是这些函数将是快速的-不需要在C++中使用的外部库中实现它们。

< p>我不知道任何库函数。但这里你有两个选择

缺失的
视为有效条目:
跳过
缺失
在输出向量中放置
缺失
: (在最后一个案例中,请注意,
缺失
被视为不存在——如果您想要一些不同的东西,可以很容易地调整行为)


朱丽亚的美在于这些函数将很快——不需要在C++中使用的外部库中实现它们。惊人的反应。我只是在浏览rleid源代码,看看是否可以复制它!非常感谢你!另外,我喜欢在Julia中为循环编写代码,而不用担心运行缓慢。我没有查看rleid源代码(这就是为什么我不知道它们如何处理
缺失的
)。实际上,
missing
在这两个函数中都很棘手,因为将
missing
与任何产生
missing
而不是
Bool
的东西进行比较,所以您必须小心(除非您确定您的数据没有丢失)。我的思路与您编写的for循环相同。很高兴看到我的想法得到证实。我主要是R用户。不过,我喜欢为函数编写循环,并使用Julia编写更多的循环。我认为我通过使用Julia而不是R学到了更多,这太棒了。类型对我来说是新的。但是朱莉娅的文档太好了,我肯定学到了一些东西!哇!惊人的反应。我只是在浏览rleid源代码,看看是否可以复制它!非常感谢你!另外,我喜欢在Julia中为循环编写代码,而不用担心运行缓慢。我没有查看rleid源代码(这就是为什么我不知道它们如何处理
缺失的
)。实际上,
missing
在这两个函数中都很棘手,因为将
missing
与任何产生
missing
而不是
Bool
的东西进行比较,所以您必须小心(除非您确定您的数据没有丢失)。我的思路与您编写的for循环相同。很高兴看到我的想法得到证实。我主要是R用户。不过,我喜欢为函数编写循环,并使用Julia编写更多的循环。我认为我通过使用Julia而不是R学到了更多,这太棒了。类型对我来说是新的。但是朱莉娅的文档太好了,我肯定学到了一些东西!
function rleid(x::AbstractVector)
    isempty(x) && return Int[]
    rle = similar(x, Int)
    idx = 1
    rle[1] = idx
    prev = x[1]
    for i in 2:length(x)
        this = x[i]
        if ismissing(this)
            if !ismissing(prev)
                prev = this
                idx += 1    
            end
        else
            if ismissing(prev) || this != prev
                prev = this
                idx += 1
            end
        end
        rle[i] = idx
    end
    rle
end
function rleid_missing(x::AbstractVector)
    isempty(x) && return Union{Int,Missing}[]
    rle = similar(x, Union{Int, Missing})
    start_i = 1
    while start_i <= length(x) && ismissing(x[start_i])
        rle[start_i] = missing
        start_i += 1
    end
    if start_i <= length(x)
        idx = 1
        rle[start_i] = idx
        prev = x[start_i]
        start_i += 1
        for i in start_i:length(x)
            this = x[i]
            if ismissing(this)
                rle[i] = missing
            else
                if this != prev
                    prev = this
                    idx += 1
                end
                rle[i] = idx
            end
        end
    end
    rle
end
Main> rleid([missing,3,4,4,missing,1,1,missing,missing,6])
10-element Array{Int64,1}:
 1
 2
 3
 3
 4
 5
 5
 6
 6
 7

Main> rleid_missing([missing,3,4,4,missing,1,1,missing,missing,6])
10-element Array{Union{Int64, Missings.Missing},1}:
  missing
 1
 2
 2
  missing
 3
 3
  missing
  missing
 4

Main> rleid_missing([missing,3,4,4,missing,1,1,missing,missing,1,6])
11-element Array{Union{Int64, Missings.Missing},1}:
  missing
 1
 2
 2
  missing
 3
 3
  missing
  missing
 3
 4