Skip to content
This repository was archived by the owner on May 4, 2019. It is now read-only.

Commit 4b917df

Browse files
committed
Merge pull request #121 from JuliaStats/sjk/weighted-mean
Add basic weighted mean
2 parents 6ebb5fe + acace4d commit 4b917df

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

src/reduce.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,23 @@ Base.stdm(A::DataArray, m::Number; corrected::Bool=true, skipna::Bool=false) =
170170

171171
Base.std(A::DataArray; corrected::Bool=true, mean=nothing, skipna::Bool=false) =
172172
sqrt(var(A; corrected=corrected, mean=mean, skipna=skipna))
173+
174+
## weighted mean
175+
176+
function Base.mean{W,V}(a::DataArray, w::WeightVec{W,V}; skipna::Bool=false)
177+
if skipna
178+
v = a .* w.values
179+
sum(v; skipna=true) / sum(DataArray(w.values, v.na); skipna=true)
180+
else
181+
anyna(a) ? NA : mean(a.data, w)
182+
end
183+
end
184+
185+
function Base.mean{W,V<:DataArray}(a::DataArray, w::WeightVec{W,V}; skipna::Bool=false)
186+
if skipna
187+
v = a .* w.values
188+
sum(v; skipna=true) / sum(DataArray(w.values.data, v.na); skipna=true)
189+
else
190+
anyna(a) || anyna(w.values) ? NA : wsum(a.data, w.values.data) / w.sum
191+
end
192+
end

test/reduce.jl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module TestReduce
2-
using DataArrays, Base.Test
2+
using DataArrays, Base.Test, StatsBase
33

44
srand(1337)
55

@@ -132,4 +132,21 @@ end
132132
@test !reduce(&, @data([false, NA]))
133133
@test reduce(|, @data([true, NA]))
134134
@test isna(reduce(|, @data([false, NA])))
135+
136+
# weighted mean
137+
da1 = DataArray(randn(128))
138+
da2 = DataArray(randn(128))
139+
@same_behavior mean(da1, weights(da2)) mean(da1.data, weights(da2.data))
140+
@same_behavior mean(da1, weights(da2.data)) mean(da1.data, weights(da2.data))
141+
@same_behavior mean(da1, weights(da2); skipna=true) mean(da1.data, weights(da2.data))
142+
@same_behavior mean(da1, weights(da2.data); skipna=true) mean(da1.data, weights(da2.data))
143+
144+
da1[1:3:end] = NA
145+
@same_behavior mean(da1, weights(da2); skipna=true) mean(dropna(da1), weights(da2.data[!da1.na]))
146+
@same_behavior mean(da1, weights(da2.data); skipna=true) mean(dropna(da1), weights(da2.data[!da1.na]))
147+
148+
da2[1:2:end] = NA
149+
keep = !da1.na & !da2.na
150+
@test isna(mean(da1, weights(da2)))
151+
@same_behavior mean(da1, weights(da2); skipna=true) mean(da1.data[keep], weights(da2.data[keep]))
135152
end

0 commit comments

Comments
 (0)