Dataframe 为每个ID分配唯一值

Dataframe 为每个ID分配唯一值,dataframe,julia,Dataframe,Julia,我需要以升序将每个id替换为唯一值 数据 df = DataFrame(id=[1,1,1,3,3,3,4,4,4,7,7,7], time=[0,1,2,0,1,2,0,1,2,0,1,2], conc=[missing,100,70,missing,60,40, missing,90,80, missing,99,70]) 输出 df1 = DataFrame(id=[1,1,1,2,2,2,3,3,3,4,4,4],

我需要以升序将每个
id
替换为唯一值

数据

df = DataFrame(id=[1,1,1,3,3,3,4,4,4,7,7,7],
               time=[0,1,2,0,1,2,0,1,2,0,1,2],
               conc=[missing,100,70,missing,60,40, missing,90,80, missing,99,70])
输出

df1 = DataFrame(id=[1,1,1,2,2,2,3,3,3,4,4,4],
                time=[0,1,2,0,1,2,0,1,2,0,1,2],
                conc=[missing,100,70,missing,60,40, missing,90,80, missing,99,70])
我尝试使用这个循环,但是当我尝试编织文档时,这个循环失败了

f = 0
df.id = 0
for b = 1:nrow(df)
    if df.time[b] == 0
       f = f + 1
       df.id[b] = f
    else
       df.id[b] = f
    end
end

您的循环通常是正确的,但在Julia中,当您要为数据帧或矩阵的列指定值时,您正在进行boardcasting,并且boardcasting操作需要在运算符之前或函数名称之后添加一个点。因此,将df.id分配给0的正确方法是
df.id.=0

除了@hhilrun的上述注释之外,以下是一些简单的方法来完成您想要的操作(我在每种情况下都创建一个新的数据帧,以避免覆盖源数据帧)

备选案文1。使用StatsBase.jl

julia> using StatsBase

julia> transform(df, :id => denserank => :id)
12×3 DataFrame
 Row │ id     time   conc    
     │ Int64  Int64  Int64?  
─────┼───────────────────────
   1 │     1      0  missing 
   2 │     1      1      100
   3 │     1      2       70
   4 │     2      0  missing 
   5 │     2      1       60
   6 │     2      2       40
   7 │     3      0  missing 
   8 │     3      1       90
   9 │     3      2       80
  10 │     4      0  missing 
  11 │     4      1       99
  12 │     4      2       70
备选案文2。使用拆分应用联合收割机:

julia> df2 = copy(df);

julia> df2.id = groupindices(groupby(df2, :id));

julia> df2
12×3 DataFrame
 Row │ id      time   conc    
     │ Int64?  Int64  Int64?  
─────┼────────────────────────
   1 │      1      0  missing 
   2 │      1      1      100
   3 │      1      2       70
   4 │      2      0  missing 
   5 │      2      1       60
   6 │      2      2       40
   7 │      3      0  missing 
   8 │      3      1       90
   9 │      3      2       80
  10 │      4      0  missing 
  11 │      4      1       99
  12 │      4      2       70
备选案文3。使用
cumsum

julia> df3 = copy(df);

julia> df3.id = cumsum(df3.time .== 0);

julia> df3
12×3 DataFrame
 Row │ id     time   conc    
     │ Int64  Int64  Int64?  
─────┼───────────────────────
   1 │     1      0  missing 
   2 │     1      1      100
   3 │     1      2       70
   4 │     2      0  missing 
   5 │     2      1       60
   6 │     2      2       40
   7 │     3      0  missing 
   8 │     3      1       90
   9 │     3      2       80
  10 │     4      0  missing 
  11 │     4      1       99
  12 │     4      2       70
备选案文4。使用
累计

julia> df4 = copy(df);

julia> df4.id = accumulate((x, y) -> x + (y == 0), df4.time, init=0);

julia> df4
12×3 DataFrame
 Row │ id     time   conc    
     │ Int64  Int64  Int64?  
─────┼───────────────────────
   1 │     1      0  missing 
   2 │     1      1      100
   3 │     1      2       70
   4 │     2      0  missing 
   5 │     2      1       60
   6 │     2      2       40
   7 │     3      0  missing 
   8 │     3      1       90
   9 │     3      2       80
  10 │     4      0  missing 
  11 │     4      1       99
  12 │     4      2       70
请注意,选项3和选项4仅依赖于
:time
列的特殊结构,而选项1和选项2仅依赖于
:id
列中存储的值。 还要注意,在选项3和选项4中,您可以使用
cumsum
累计
对列
:id
执行就地赋值