2016-01-04 5 views
3

Использование DataFramesMeta.jl модуля, операции могут быть связаны с Джулией, используя следующий подходЯвного указания аргумента, когда цепочки операций в Джулии

using DataFrames, DataFramesMeta 
df = DataFrame(a = collect(1:5), b = ["a","b","c","d","e"]) 
@> begin 
    df 
    @where(:a .> 2) 
    @select(:a, :b, c = :a*2) 
end 
# or: 
print(
    @linq df |> 
    @where(:a .> 2) |> 
    @select(:a,:b, c = :a*2) 
) 

3x3 DataFrames.DataFrame 
| Row | a | b | c | 
|-----|---|-----|----| 
| 1 | 3 | "c" | 6 | 
| 2 | 4 | "d" | 8 | 
| 3 | 5 | "e" | 10 | 

Идея заключается в том, что df является первым аргументом макроса @where и все @where заявления фидов как первый аргумент в макросе @select.

Однако нам может потребоваться, чтобы верхняя строка стала вторым аргументом, или мы можем использовать ее в нескольких местах. Для пользователей R (в операциях R могут быть прикованными с помощью %>%), dplyr пакет позволяет это с точки (.) нотации, так что следующий будет работать:

library(dplyr) 
df = data.frame(a = 1:5, b = c("a","b","c","d","e")) 
df %>% filter(a > 2) %>% mutate(c = nrow(.):1) %>% select(b,c) 

    b c 
1 c 3 
2 d 2 
3 e 1 

Я искал способ имитировать точечную нотацию R в , но, к сожалению, точечное обозначение не работает в Julia, и я не мог найти ничего об этом в документации пакета.

Если кто-нибудь знает, как это может быть достигнуто, сообщите нам об этом.

ответ

5

using Lazy Когда, @as макрос позволяет назвать резьбовую аргумент:

@as _ x f(_, y) g(z, _) == g(z, f(x, y)) 

С @as макро указанная задача может быть сделано, как это:

julia> import [email protected] 

julia> using DataFrames, DataFramesMeta 

julia> df = DataFrame(a = collect(1:5), b = ["a","b","c","d","e"]) 
5x2 DataFrames.DataFrame 
| Row | a | b | 
|-----|---|-----| 
| 1 | 1 | "a" | 
| 2 | 2 | "b" | 
| 3 | 3 | "c" | 
| 4 | 4 | "d" | 
| 5 | 5 | "e" | 

julia> @as _ df @where(_, :a .> 2) @select(_,:a, :b, c = :a*2) 
3x3 DataFrames.DataFrame 
| Row | a | b | c | 
|-----|---|-----|----| 
| 1 | 3 | "c" | 6 | 
| 2 | 4 | "d" | 8 | 
| 3 | 5 | "e" | 10 | 
+0

Отлично, спасибо! Это именно то, что я искал. – IVR