11 julia
我认为感叹号!是逻辑NOT运算符的符号。现在,在学习DataFrames包中的索引时,我遇到了这个:data[!,:Treatment]. 这似乎与使用已知的冒号符号相同:
data[:,:Treatment]==data[!,:Treatment]是true。
为什么会有这种冗余呢?
fre*_*kre 12
!in 索引特定于DataFrames, 并表示您想要对存储数据的底层向量的引用,而不是它的副本。您可以DataFrames 在此处阅读有关索引的所有信息。在您的示例中,两者都是==因为所有值都相同,但它们不是===因为df[:, :Treatment]为您提供了基础数据的副本。
例子:
julia> using DataFrames
julia> df = DataFrame(y = [1, 2, 3]);
julia> df[:, :y] == df[!, :y] # true because all values are equal
true
julia> df[:, :y] === df[!, :y] # false because they are not the same vector
false
Run Code Online (Sandbox Code Playgroud)
引用DataFrames.jl的文档:
可以通过
df.col或直接(即无需复制)访问列df[!, :col]。[...] 由于df[!, :col]不进行复制,因此更改此语法返回的列向量的元素将影响存储在原始df. 要获取列的副本,请使用df[:, :col]:更改此语法返回的向量不会更改df。
一个例子可能会更清楚地说明这一点:
julia> using DataFrames
julia> df = DataFrame(x = rand(5), y=rand(5))
5×2 DataFrame
? Row ? x ? y ?
? ? Float64 ? Float64 ?
??????????????????????????????
? 1 ? 0.937892 ? 0.42232 ?
? 2 ? 0.54413 ? 0.932265 ?
? 3 ? 0.961372 ? 0.680818 ?
? 4 ? 0.958788 ? 0.923667 ?
? 5 ? 0.942518 ? 0.0428454 ?
Run Code Online (Sandbox Code Playgroud)
# `a` is a copy of `df.x`: modifying it will not affect `df`
julia> a = df[:, :x]
5-element Array{Float64,1}:
0.9378915597741728
0.544130347207969
0.9613717853719412
0.958788066884128
0.9425183324742632
julia> a[2] = 1;
julia> df
5×2 DataFrame
? Row ? x ? y ?
? ? Float64 ? Float64 ?
??????????????????????????????
? 1 ? 0.937892 ? 0.42232 ?
? 2 ? 0.54413 ? 0.932265 ?
? 3 ? 0.961372 ? 0.680818 ?
? 4 ? 0.958788 ? 0.923667 ?
? 5 ? 0.942518 ? 0.0428454 ?
Run Code Online (Sandbox Code Playgroud)
# `b` is a view of `df.x`: any change made to it will be reflected in df
julia> b = df[!, :x]
5-element Array{Float64,1}:
0.9378915597741728
0.544130347207969
0.9613717853719412
0.958788066884128
0.9425183324742632
julia> b[2] = 1;
julia> df
5×2 DataFrame
? Row ? x ? y ?
? ? Float64 ? Float64 ?
??????????????????????????????
? 1 ? 0.937892 ? 0.42232 ?
? 2 ? 1.0 ? 0.932265 ?
? 3 ? 0.961372 ? 0.680818 ?
? 4 ? 0.958788 ? 0.923667 ?
? 5 ? 0.942518 ? 0.0428454 ?
Run Code Online (Sandbox Code Playgroud)
请注意,由于索引与!不涉及任何数据复制,因此通常会更有效。