performance - 按组matlab计算观察次数
问题描述
我有一个看起来像这样的 matlab 数据集:
year value
1995 90000
1995 53000
1995 80000
1995 60000
1995 37000
1995 42000
1995 13102
1996 35000
1996 50000
1996 32000
1996 47000
1997 36000
1997 90000
1997 NaN
1997 90000
1997 51500
1997 81000
1998 71000
(...)
2020 68000
这是两个单独的数据列。
现在我想计算value
2010 年至 2020 年间每年列中非 NaN 观测值的数量,即输出应如下所示:
year count
2010 20
2011 31
(...)
2020 9
如果任何计数为零,则应显示为零。
我知道我可以用一个非常简单的循环来做到这一点(下面的例子)。但这对于大型数据集来说是非常低效的。我正在研究 accumarray,但不知道该怎么做。
N = 300;
%Generate years vector
years = round(1996 + (2020-1996) .* (rand(N,1)));
years = sort(years);
% Generate values vector
values = rand(N,1);
NaN_position = rand(N,1)>.9; %Now put some random NaNs
values(NaN_position) = NaN;
count = 1;
for y=min(years):max(years)
indicator = years == y;
count_vals(count,1) = sum(not(isnan(values(indicator))));
count = count + 1;
end
解决方案
让数据定义为:
years = [1995 1995 1995 1995 1995 1995 1995 1996 1996 1996 1996 1997 1997 1997 1997 1997 1997 1998 2020].';
values = [90000 53000 80000 60000 37000 42000 13102 35000 50000 32000 47000 36000 90000 NaN 90000 51500 81000 71000 68000].';
year_min = 1996;
year_max = 1998;
然后:
result_year = year_min:year_max;
result_count = histcounts(years(~isnan(values)), [result_year year_max+.5]);
year_max+.5
在第二个输入中需要该术语,histcounts
因为根据文档,最后一个 bin 包括右边缘。
推荐阅读
- ios - 删除托管对象的 KVO 观察者的合适位置是什么
- javascript - js - 分配了 2 个变量,但只有 1 个有效
- python-3.x - 创建窗口类 Tkinter
- python-3.x - 如何使用 Python 中用 Vala 编写的自定义 GTK 小部件?
- android - Android 9 设备上的 AdapterView 不支持 RemoveView
- javascript - JS 代理和解构赋值
- java - 在 jmeter 上进行负载测试以比较请求和响应
- c++ - 预期 '=', ',' , ';' , 'asm' 或 '__attribute__' 之前的 ':' 标记问题和预期的标识符或 '(' 在 '{' 标记之前
- hibernate - 使用动态查找器时有没有办法忽略 hasMany 关系?
- scala - 如何在 scala <= 2.12 中为 Traversable[(K, V)] 编写通用 groupByKey