DataFrames 文档有一个Comparison with dplyr 部分。您可以看到 dplyr 中的 mutates 对应于 DataFrames.jl 中的 transforms。 transform 还允许通过多种方式选择要操作的列,可用于mutate_if 功能。
julia> df = DataFrame(x = [10, 15, 20, 25], y = [12.5, 20, 101, 102], colors = [:red, :blue, :green, :cyan])
4×3 DataFrame
Row │ x y colors
│ Int64 Float64 Symbol
─────┼────────────────────────
1 │ 10 12.5 red
2 │ 15 20.0 blue
3 │ 20 101.0 green
4 │ 25 102.0 cyan
julia> transform(df, names(df, Number) .=> (c -> c / 5) => identity)
4×3 DataFrame
Row │ x y colors
│ Float64 Float64 Symbol
─────┼──────────────────────────
1 │ 2.0 2.5 red
2 │ 3.0 4.0 blue
3 │ 4.0 20.2 green
4 │ 5.0 20.4 cyan
names(df, Number) 返回元素为 Numbers 的列名称的向量(即任何 Number 子类型)。
c -> c / 5 将列除以 5(Julia 默认按元素应用)。
.=> 对每一列单独应用上述转换,而不是一起应用。
identity 只是告诉 transform 不要更改列的名称。
(此答案之前建议将 transform(df, Cols(in(names(df, Number))) => ByRow((c...) -> c ./ 5) => identity) 作为解决方案。感谢 cmets 中的 @Bogumił Kamiński 提出了当前更简单的方法。)
上面的transform 返回结果数据帧,而不更改df。您可以使用
transform!(df, names(df, Number) .=> (c -> c / 5) => identity)
(注意transform 之后的!)就地执行此操作并直接更新df。