如何在julia中仅选择dataframe列的子集

如何在julia中仅选择dataframe列的子集,julia,Julia,我有一个由几列组成的数据框架,比如第1列、第2列……第100列。如何仅选择列的子集,例如(不是列1)应返回所有列column2…column100 data[[colnames(data) .!= "column1"]]) 似乎不起作用 我不想改变数据帧。我只想选择所有没有特定列名的列,如我的示例中所示。colnames(data)。!=“column1”#=>返回布尔值的数组 我认为正确的方法是使用一个过滤器函数,返回所需的列名 filter(x->x!=“column1”,colnames

我有一个由几列组成的数据框架,比如第1列、第2列……第100列。如何仅选择列的子集,例如(不是列1)应返回所有列column2…column100

data[[colnames(data) .!= "column1"]])
似乎不起作用

我不想改变数据帧。我只想选择所有没有特定列名的列,如我的示例中所示。

colnames(data)。!=“column1”
#=>返回布尔值的数组

我认为正确的方法是使用一个过滤器函数,返回所需的列名

filter(x->x!=“column1”,colnames(data))
返回一个字符串数组

数据帧列名是符号数据类型


map(symbol,str_array_of_filterd_column_name)
#=>返回相同符号的数组

正如@Reza Afzalan所说,您尝试执行的操作返回字符串数组,而数据帧中的列名是符号

鉴于Julia没有条件列表理解能力,我想你能做的最好的事情就是

data[:, filter(x -> x != :column1, names(df))]
这将为您提供删除了第1列的数据集(无需对其进行修改)。您还可以将其扩展到检查姓名列表:

data[:, filter(x -> !(x in [:column1,:column2]), names(df))]
更新:正如Ian在下面所说的,对于这个用例,
Not
语法现在是最好的选择

更一般地说,条件列表理解现在也可用,因此您可以执行以下操作:

data[:, [x for x in names(data) if x != :column1]]
编辑11/3/21:鉴于人们仍在对此进行投票,我想我应该更新它,说DataFrames现在允许字符串作为列名,实际上,
names()
函数现在返回字符串,所以您可以这样做

data[:, [x for x in names(data) if x != "column1"]]
但正如Ian在下面所说的,更新版本的数据帧还附带了
inversedics
导出,因此您可以直接执行

data[:, Not("column1")] # or :column1


一种方法是使用索引选择一系列列

idx=长度(数据)
数据[2:idx]


执行条件选择的其他方法是在

中按名称选择多个列:

 df[[:col1, :col2]
或者,对于DataFrames库的其他版本,我使用:

select(df, [:col1, :col2])

从DataFrames 0.19开始,您现在似乎可以

select(data, Not(:column1))
选择除列之外的所有列
column1
。要选择除多列以外的所有列,请在反向索引中使用数组:

select(data, Not([:column1, :column2]))


提到使用一组名称作为选择,尽管没有深入讨论定义此类集合的方法。
data[!,2:ncol(df)]
选择除第一列以外的所有列有什么问题吗?谢谢。这没什么问题,不过如果你那样做的话,我可能会把它写成
data[!,2:end]
只要确保所有要删除的列都存在于数据中,否则会引发
ArgumentError:column not found in the data frame
这很有效。在本例中,它返回dataframe列的副本。我认为等价物是
df[:,[:col1,:col2]]
。要获取对相同数据帧列的引用(不要复制),请使用
df[!,[:col1,:col2]]
select(data, Not([:column1, :column2]))