這應該是一個簡單的問題,但我找不到任何關于這個問題的檔案或先前的Q&A。使用Julia進行子集是很容易的,尤其是使用@Chain命令。但是我還沒有想出一種方法來對一個日期進行子集:
maindf = @chain rawdf begin
@subset(Dates.year(:travel_date) . == 2019)
結束。
在所有的檔案中,Dates.year(today())應該產生(2021),但這最終給我帶來了一個錯誤:
ERROR: MethodError: 沒有方法匹配 (::Vector{Date}, ::Int64)
最接近的候選者是:
(::任何, :: Any, :: Any, :: Any. ...)在operators.jl:560。
(::T, :: T) 其中T<:Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8}在int. jl:87。
(::T, ::Integer) where T<: AbstractChar at char. jl:223。
不確定我為什么會得到一個方法錯誤......
在使用DPLYR的R中,這將是:
maindf = rawdf %>/span>%
filter(., year(travel_date) == 2019)
有什么想法嗎?
uj5u.com熱心網友回復:
使用:
julia> using DataFramesMeta, Dates
julia> df = DataFrame(travel_date=repeat([Date(2019, 1,1), Date(2020,1,1)],3), id=1: 6)
6×2 DataFrame
Row │ travel_date id
│ Date Int64
─────┼────────────────────。
1 │ 2019-01-01 1
2 │ 2020-01-01 2
3 │ 2019-01-01 3
4 │ 2020-01-01 4
5 │ 2019-01-01 5
6 │ 2020-01-01 6
julia> @rsubset(df, year(: travel_date) == 2019)
3×2 DataFrame
Row │ travel_date id
│ Date Int64
─────┼────────────────────。
1 │ 2019-01-01 1
2 │ 2019-01-01 3
3 │ 2019-01-01 5
julia> @subset(df, year. (:travel_date) .== 2019)
3×2 DataFrame
Row │ travel_date id
│ Date Int64
─────┼────────────────────。
1 │ 2019-01-01 1
2 │ 2019-01-01 3
3 │ 2019-01-01 5
區別在于,@rsubset是按行作業,而@subset是按整列作業。
你的問題是在Dates.year(:travel_date) .==2019)中,你混合了非廣播式呼叫year函式和廣播式比較.==2019。你總是需要確保你是按行作業(在這種情況下使用@rsubset)或按整列作業(使用@subset)。
不同的場景可能需要不同的方法。下面是一個例子,當整列方法是有用的:
julia> using Statistics
julia> @subset(df, :id .> mean(:id))
3×2 DataFrame
Row │ travel_date id
│ Date Int64
─────┼────────────────────
1 │ 2020-01-01 4
2 │ 2019-01-01 5
3 │ 2020-01-01 6
當你想讓mean在一整列上操作時。
編輯部
下面是與@chain相同的情況:
julia> @chain df begin
@subset year. (:travel_date) .= = 2019
end
3×2 DataFrame
Row │ travel_date id
│ Date Int64
─────┼────────────────────
1 │ 2019-01-01 1
2 │ 2019-01-01 3
3 │ 2019-01-01 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/310922.html
標籤:
下一篇:在回傳前動態地乘以一行的值
