如何在给定分隔符的情况下将 DataFrame 列一分为二?

Vit*_*tor 3 julia

给定dfJulia 中的 DataFrame :

using DataFrames
df = DataFrame(X = ['A', 'B', 'C'], Y = ["a|b", "a|c", "b|b"])
Run Code Online (Sandbox Code Playgroud)

如何通过在“|”处拆分 Y 列来创建 Y1 和 Y2 列 分隔符?

例如,在 R tidyverse 我会这样做:

separate(df, Y, c("Y1", "Y2"), by = "\\|")
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 6

据我所知,没有内置函数可以做到这一点。

我想到的两种相对简洁的方法是:

julia> df = DataFrame(X = ['A', 'B', 'C'], Y = ["a|b", "a|c", "b|b"])
3×2 DataFrame
? Row ? X    ? Y      ?
?     ? Char ? String ?
???????????????????????
? 1   ? 'A'  ? a|b    ?
? 2   ? 'B'  ? a|c    ?
? 3   ? 'C'  ? b|b    ?

julia> data = split.(df.Y, '|')
3-element Array{Array{SubString{String},1},1}:
 ["a", "b"]
 ["a", "c"]
 ["b", "b"]

julia> foreach(enumerate([:Y1, :Y2])) do (i, n)
           df[!, n] = getindex.(data, i)
       end

julia> df
3×4 DataFrame
? Row ? X    ? Y      ? Y1        ? Y2        ?
?     ? Char ? String ? SubStrin… ? SubStrin… ?
???????????????????????????????????????????????
? 1   ? 'A'  ? a|b    ? a         ? b         ?
? 2   ? 'B'  ? a|c    ? a         ? c         ?
? 3   ? 'C'  ? b|b    ? b         ? b         ?
Run Code Online (Sandbox Code Playgroud)

或者

julia> df = DataFrame(X = ['A', 'B', 'C'], Y = ["a|b", "a|c", "b|b"])
3×2 DataFrame
? Row ? X    ? Y      ?
?     ? Char ? String ?
???????????????????????
? 1   ? 'A'  ? a|b    ?
? 2   ? 'B'  ? a|c    ?
? 3   ? 'C'  ? b|b    ?

julia> hcat(df, DataFrame(reduce(vcat, permutedims.(split.(df.Y, '|'))), [:Y1, :Y2]))
3×4 DataFrame
? Row ? X    ? Y      ? Y1        ? Y2        ?
?     ? Char ? String ? SubStrin… ? SubStrin… ?
???????????????????????????????????????????????
? 1   ? 'A'  ? a|b    ? a         ? b         ?
? 2   ? 'B'  ? a|c    ? a         ? c         ?
? 3   ? 'C'  ? b|b    ? b         ? b         ?
Run Code Online (Sandbox Code Playgroud)