我的MATALB talbe看起来像:
table_variables =
Meas Group1 Group2 Subject_id Age Sex Var1 Var2
___ _____ _____ __________ ___ ________ ____ ____
1 'A' '0' 1 60 'Male' 48 150
2 'A' '0' 1 60 'Male' 47 100
3 'A' '0' 1 60 'Male' 48 90
4 'A' '0' 1 60 'Male' 38 250
1 'A' '3' 2 50 'Male' 50 450
2 'A' '3' 2 50 'Male' 43 150
3 'A' '3' 2 50 'Male' 45 100
...
...
1 'B' '2' 900 66 'Female' 66 170
2 'B' '2' 900 66 'Female' 68 110
3 'B' '2' 900 66 'Female' 70 250
对于每个主题,变量Var1和Var2有多个测量值。如何创建一个包含每个主题平均值的新表格?请假设我有两个以上的变量,所以代码:
mean_var1 = varfun(@mean,T,'InputVariables','Var1',...
'GroupingVariables','Subject_id')
mean_var2 = varfun(@mean,T,'InputVariables','Var2',...
'GroupingVariables','Subject_id')
答案 0 :(得分:3)
从varfun
的文档中,'InputVariables'
属性可以传递以下内容:
传递给
A
的{{1}}变量,指定为以逗号分隔的对 由func
和正整数组成,向量为 正整数,变量名,变量名的单元数组或 逻辑向量,或返回逻辑的匿名函数 标量。
所以你有几个选择。一个例子,使用逻辑矢量掩码:
'InputVariables'
返回下表:
ID = [1, 1, 1, 2, 2, 2];
var_1 = [1, 2, 3, 4, 5, 6];
var_2 = fliplr(var_1);
t = table(ID.', var_1.', var_2.', 'VariableNames', {'ID', 'var_1', 'var_2'});
varmask = [false true true];
varmeans = varfun(@mean, t, 'InputVariables', varmask, 'GroupingVariables', 'ID');
此方法假定变量始终位于表的末尾。对于更强大的方法,您可能希望生成要处理的变量名称的单元格数组。
使用上面的例子:
varmeans =
ID GroupCount mean_var_1 mean_var_2
__ __________ __________ __________
1 1 3 2 5
2 2 3 5 2
将返回相同的结果。我在这里使用了nvars = 2;
varnames = sprintfc('var_%u', 1:nvars); % Caveat, sprintfc is an undocumented function
varmeans = varfun(@mean, t, 'InputVariables', varnames, 'GroupingVariables', 'ID');
来避免中间步骤,但请注意它是一个未记录的函数,所以通常的警告适用。