Julia:如何在DataFrames.jl中用一个函数创建多个列



假设我有一列

using DataFrames
df = DataFrame(var = "methodA_mean")
1×3 DataFrame
│ Row │ var          │
│     │ String       │
├─────┼──────────────┼
│ 1   │ methodA_mean │
│ 2   │ methodB_var  │
│ 3   │ methodA_var  │

我想通过提取A和均值var来创建两个新列,就像一样

3×3 DataFrame
│ Row │ var          │ ab     │ stat   │
│     │ String       │ String │ String │
├─────┼──────────────┼────────┼────────┤
│ 1   │ methodA_mean │ A      │ mean   │
│ 2   │ methodB_var  │ B      │ var    │
│ 3   │ methodA_var  │ A      │ var    │

我可以写一个正则表达式摘录";A";或";B";以及";平均值;以及";var";来自CCD_ 1列。但是我如何优雅地输出到多个列中呢?

我尝试了下面的方法,它很有效,但我觉得应该有更优雅的方法来创建多个列

tmp = match.(r"method(?<ab>A|B)_(?<stat>mean|var)", df.var)
df.ab = getindex.(tmp, :ab)
df.stat = getindex.(tmp, :st)
3×3 DataFrame
│ Row │ var          │ ab       │ stat     │
│     │ String       │ SubStri… │ SubStri… │
├─────┼──────────────┼──────────┼──────────┤
│ 1   │ methodA_mean │ A        │ mean     │
│ 2   │ methodB_var  │ B        │ var      │
│ 3   │ methodA_var  │ A        │ var      │

我不确定你在代码的哪一部分寻求改进,因为这对我来说似乎很正常,但你可以这样写:

julia> insertcols!(df, :ab => last.(first.(df.var, 7), 1), :stat => chop.(df.var, head=8, tail=0))
3×3 DataFrame
│ Row │ var          │ ab     │ stat     │
│     │ String       │ String │ SubStri… │
├─────┼──────────────┼────────┼──────────┤
│ 1   │ methodA_mean │ A      │ mean     │
│ 2   │ methodB_var  │ B      │ var      │
│ 3   │ methodA_var  │ A      │ var      │

DataFrames函数selecttransform可以通过从函数返回Matrix来处理多列输出。例如:

df = DataFrame(var = ["methodA_mean", "methodB_var", "methodA_var"])
function extract(xs)
matches = match.(r"method(?<ab>A|B)_(?<stat>mean|var)", xs)
return [getindex(m, i) for m in matches, i in (:ab, :stat)]
# returns a 3x2 Matrix
end
df2 = transform(df, :var => extract => [:ab, :stat])

最后一行中的转换函数取var列,将其发送给extract函数(作为Vector(,然后返回Matrix。该CCD_ 10的列被添加到具有在第二CCD_ 12之后指定的名称的CCD_。

最新更新