在索引Julia数据帧时感叹号的含义是什么?

在索引Julia数据帧时感叹号的含义是什么?,julia,Julia,我以为感叹号是逻辑NOT运算符的符号。现在,在学习DataFrames包中的索引时,我遇到了这样一个问题:data[!,:Treatment]。这似乎与使用已知的冒号符号相同: data[:,:Treatment]==data[!,:Treatment]为true 那么为什么会出现这种冗余?引用以下文件: 可以通过df.col或df[!,:col]直接访问列(即无需复制)。[…]由于df[!,:col]不复制,因此更改此语法返回的列向量的元素将影响原始df中存储的值。要获取列的副本,请使用df[

我以为感叹号
是逻辑
NOT
运算符的符号。现在,在学习
DataFrames
包中的索引时,我遇到了这样一个问题:
data[!,:Treatment]
。这似乎与使用已知的冒号符号相同

data[:,:Treatment]==data[!,:Treatment]
true


那么为什么会出现这种冗余?

引用以下文件:

可以通过
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 │


请注意,由于使用
建立索引不涉及任何数据拷贝,通常效率更高。

特定于
数据帧
,表示您希望引用存储数据的基础向量,而不是其副本。您可以阅读有关索引数据帧的所有信息。在您的示例中,这两个值都是
=
,因为所有值都相同,但它们不是
==
,因为
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

那么这与C语言中的解引用操作符
*
相同吗?您可以将数据帧视为(或多或少)一个包含向量的
结构体
——每列一个
df[!,:y]
是与
df.y
相同的向量,这意味着两个向量指向相同的内存块。一个小注释是
df[!,:y]
允许作为广播分配的LHS,而
df.y
如果
:y
df
中不存在(由于基的限制),则不允许使用
df.y
。另外,
df[!,cols]
可用于创建包含来自
df
的多个列的新数据框,而无需复制它们(与新分配所有列的
df[:,cols]
相反)。
# `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 │
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