将每个时间戳多行的MATLAB表减少到每个时间戳只有一行并同时将其他值合并到这一行的表的最快方法是什么? (参见:之前和之后的例子)
由于我必须处理大量数据,有没有办法并行执行此操作(parfor,...)?
BEFORE:
Timestamp Value01 Value02 Value03
_________ _______ _______ _______
1001 01 02 []
1001 [] [] []
1001 [] [] 03
1002 [] [] 07
1002 [] 09 []
1003 04 01 []
1003 [] [] []
1004 05 06 08
AFTER:
Timestamp Value01 Value02 Value03
_________ _______ _______ _______
1001 01 02 03
1002 [] 09 07
1003 04 01 []
1004 05 06 08
答案 0 :(得分:2)
我发现你的问题很有趣,并试图找到解决方案。现在想向您展示我的方法。
首先,我尝试使用union
函数,但是tables
对我来说有点令人困惑,所以我找到的唯一方法就是将表格转换为cell
和{{1数据,使用它然后创建新表。
这里是代码:
numeric
结果是:
tab = table2cell(MyTable(:,2:end)) % convert to cell
tab( cellfun('isempty',tab) ) = {[0]} % replace [] with [0]
tab = cell2mat(tab) % convert to numeric
t = MyTable(:,{'Timestamp'}) % lets take a time
t = table2array(t) % to numeric too
t = t - 1000
fun = @(x) sum( tab( find (t == x),:),1) % find the sum of rows with the same time
arr = [1:t(end)]' %' % how many sums we need
carr = arrayfun(fun, arr, 'uniformoutput',false)
result = cell2mat(carr)
最后一步 - 创建新表。这只是一个例子:
result =
1 2 3
0 9 7
4 1 0
5 6 8
我已经完成了这个答案,我想到了你的数据......看起来像是Value01 = result(:,1)
Value01 = num2cell(Value01)
Value01(find([Value01{:}]==0)) = {[]}
%... the same for Value02 and Value03
NewTable = table(1000+arr,Value01, Value02, Value03, 'VariableNames',{'Timestamp', 'v1','v2','v3'})
NewTable =
Timestamp v1 v2 v3
_________ ___ ___ ___
1001 [1] [2] [3]
1002 [] [9] [7]
1003 [4] [1] []
1004 [5] [6] [8]
- 因为你有strings
而不是01
......但我仍然认为我的解决方案是正确的,只需要重写一下,如果你真的有1
:)