How to manage a table/matrix to obtain information using conditions

帅比萌擦擦* 提交于 2019-11-28 00:37:39

Here is the solution I propose you under Matlab (it only takes care of creating the first table, but for the second one the code is basically the same):

% Define the sample data...
X = [
    0       27        0       28         8
    1       14       24       32        33
    0        4       22       25        27 
    0        3        7       26        34
    0       28       33       31        21
    0       16       17       24        18
    1        3       19        0        12
    0        2       23        5        24
    2       17       22       22        10
    0       35       15       17         2
];

% Find the upper bound (as a multiple of 5) and build the ranges...
X_max = max(max(X(:,2:end)));
X_upper = round(X_max / 5) * 5;

% Create the required ranges and their respective string representation...
R = 5:5:X_upper;
R_len = numel(R);
R_str = sprintfc('0-%d',R);

% Filter the table rows keeping only those with A > 0...
X = X(X(:,1) > 0,2:end);

% Apply the criterions to B and D (first and third rows)...
b = arrayfun(@(x) sum(X(:,1) > 0 & X(:,1) <= x),R).';
d = arrayfun(@(x) sum(X(:,3) > 0 & X(:,3) <= x),R);

% Cross the results of both computations into a single matrix...
A = num2cell(repmat(b,1,R_len) + repmat(d,R_len,1));
A = [[{''}; R_str.'] [R_str; A]];

The comments in the code should make everything pretty self-explanatory, but if you have any doubts feel free to ask for more details. For what concerns the type of the final result A, I opted for a matrix of cells, because table rows and columns are subject to strict naming conventions, but it's very easy to switch from this output to a table-based one... for example:

% Cross the results of both computations into a single table...
A = array2table(repmat(b,1,R_len) + repmat(d,R_len,1),'RowNames',R_str,'VariableNames',R_str);

EDIT

This code properly handles data as per OP requirements:

% Find the upper bound (as a multiple of 5) and build the ranges...
X_max = max(max(X(:,2:end)));
X_upper = round(X_max / 5) * 5;

% Create the required ranges and their respective string representation...
R = 5:5:X_upper;
R_len = numel(R);
R_str = sprintfc('R_0_%d',R);

% Adjust the range for exclusive limits and project it...
R(end) = R(end) + 1;
R_rep = [repelem(R,1,7).' repmat(R,1,7).'];

% Apply the criterions to B and D (first and third rows)...
X_a = X(X(:,1) > 0,2:end);
fun_A = arrayfun(@(b,d) sum(X_a(:,1) >= 0 & X_a(:,1) < b & X_a(:,3) >= 0 & X_a(:,3) < d),R_rep(:,1),R_rep(:,2));
A = array2table(reshape(fun_A,R_len,R_len),'RowNames',R_str,'VariableNames',R_str);

% Apply the criterions to C and E (second and fourth rows)...
X_na = X(X(:,1) >= 0,2:end);
fun_B = arrayfun(@(c,e) sum(X_na(:,2) >= 0 & X_na(:,2) < c & X_na(:,4) >= 0 & X_na(:,4) < e),R_rep(:,1),R_rep(:,2));
B = array2table(reshape(fun_B,R_len,R_len),'RowNames',R_str,'VariableNames',R_str);

I wrote this code and it worked, but I would like to improve it in order to solve it in a more efficient way, and avoid it to be too tedious.

library(magrittr)
library(dplyr)

B1 = A %>%
  summarise( i0_5 = sum( (a > 0) & (b>= 0 & b< 5) & (d >=0 & d<  5) ),
             i0_10 = sum( (a > 0) & (b>= 0 & b< 5) & (d >=0 & d< 10) ),
             i0_15 = sum( (a > 0) & (b>= 0 & b< 5) & (d >=0 & d< 15) ),
             i0_20 = sum( (a > 0) & (b>= 0 & b< 5) & (d >=0 & d< 20) ),
             i0_25 = sum( (a > 0) & (b>= 0 & b< 5) & (d >=0 & d< 25) ),
             i0_30 = sum( (a > 0) & (b>= 0 & b< 5) & (d >=0 & d< 30) ),
             i0_35 = sum( (a > 0) & (b>= 0 & b< 5) & (d >=0 & d<= 35) ) )

B1=as.data.frame(t(B1))

B2 = A %>%
  summarise( i0_5 = sum( (a > 0) & (b>= 0 & b< 10) & (d >=0 & d<  5) ),
             i0_10 = sum( (a > 0) & (b>= 0 & b< 10) & (d >=0 & d< 10) ),
             i0_15 = sum( (a > 0) & (b>= 0 & b< 10) & (d >=0 & d< 15) ),
             i0_20 = sum( (a > 0) & (b>= 0 & b< 10) & (d >=0 & d< 20) ),
             i0_25 = sum( (a > 0) & (b>= 0 & b< 10) & (d >=0 & d< 25) ),
             i0_30 = sum( (a > 0) & (b>= 0 & b< 10) & (d >=0 & d< 30) ),
             i0_35 = sum( (a > 0) & (b>= 0 & b< 10) & (d >=0 & d<= 35) ) )

B2=as.data.frame(t(B2))

B3 = A %>%
  summarise( i0_5 = sum( (a > 0) & (b>= 0 & b< 15) & (d >=0 & d<  5) ),
             i0_10 = sum( (a > 0) & (b>= 0 & b< 15) & (d >=0 & d< 10) ),
             i0_15 = sum( (a > 0) & (b>= 0 & b< 15) & (d >=0 & d< 15) ),
             i0_20 = sum( (a > 0) & (b>= 0 & b< 15) & (d >=0 & d< 20) ),
             i0_25 = sum( (a > 0) & (b>= 0 & b< 15) & (d >=0 & d< 25) ),
             i0_30 = sum( (a > 0) & (b>= 0 & b< 15) & (d >=0 & d< 30) ),
             i0_35 = sum( (a > 0) & (b>= 0 & b< 15) & (d >=0 & d<= 35) ) )

B3=as.data.frame(t(B3))

B4 = A %>%
  summarise( i0_5 = sum( (a > 0) & (b>= 0 & b< 20) & (d >=0 & d<  5) ),
             i0_10 = sum( (a > 0) & (b>= 0 & b< 20) & (d >=0 & d< 10) ),
             i0_15 = sum( (a > 0) & (b>= 0 & b< 20) & (d >=0 & d< 15) ),
             i0_20 = sum( (a > 0) & (b>= 0 & b< 20) & (d >=0 & d< 20) ),
             i0_25 = sum( (a > 0) & (b>= 0 & b< 20) & (d >=0 & d< 25) ),
             i0_30 = sum( (a > 0) & (b>= 0 & b< 20) & (d >=0 & d< 30) ),
             i0_35 = sum( (a > 0) & (b>= 0 & b< 20) & (d >=0 & d<= 35) ) )

B4=as.data.frame(t(B4))

B5 = A %>%
  summarise( i0_5 = sum( (a > 0) & (b>= 0 & b< 25) & (d >=0 & d<  5) ),
             i0_10 = sum( (a > 0) & (b>= 0 & b< 25) & (d >=0 & d< 10) ),
             i0_15 = sum( (a > 0) & (b>= 0 & b< 25) & (d >=0 & d< 15) ),
             i0_20 = sum( (a > 0) & (b>= 0 & b< 25) & (d >=0 & d< 20) ),
             i0_25 = sum( (a > 0) & (b>= 0 & b< 25) & (d >=0 & d< 25) ),
             i0_30 = sum( (a > 0) & (b>= 0 & b< 25) & (d >=0 & d< 30) ),
             i0_35 = sum( (a > 0) & (b>= 0 & b< 25) & (d >=0 & d<= 35) ) )

B5=as.data.frame(t(B5))

B6 = A %>%
  summarise( i0_5 = sum( (a > 0) & (b>= 0 & b< 30) & (d >=0 & d<  5) ),
             i0_10 = sum( (a > 0) & (b>= 0 & b< 30) & (d >=0 & d< 10) ),
             i0_15 = sum( (a > 0) & (b>= 0 & b< 30) & (d >=0 & d< 15) ),
             i0_20 = sum( (a > 0) & (b>= 0 & b< 30) & (d >=0 & d< 20) ),
             i0_25 = sum( (a > 0) & (b>= 0 & b< 30) & (d >=0 & d< 25) ),
             i0_30 = sum( (a > 0) & (b>= 0 & b< 30) & (d >=0 & d< 30) ),
             i0_35 = sum( (a > 0) & (b>= 0 & b< 30) & (d >=0 & d<= 35) ) )

B6=as.data.frame(t(B6))

B7 = A %>%
  summarise( i0_5 = sum( (a > 0) & (b>= 0 & b< 35) & (d >=0 & d<  5) ),
             i0_10 = sum( (a > 0) & (b>= 0 & b< 35) & (d >=0 & d< 10) ),
             i0_15 = sum( (a > 0) & (b>= 0 & b<= 35) & (d >=0 & d< 15) ),
             i0_20 = sum( (a > 0) & (b>= 0 & b<= 35) & (d >=0 & d< 20) ),
             i0_25 = sum( (a > 0) & (b>= 0 & b<= 35) & (d >=0 & d< 25) ),
             i0_30 = sum( (a > 0) & (b>= 0 & b<= 35) & (d >=0 & d< 30) ),
             i0_35 = sum( (a > 0) & (b>= 0 & b<= 35) & (d >=0 & d<= 35) ) )

B7=as.data.frame(t(B7))
Em=cbind(B1,B2,B3,B4,B5,B6,B7)
colnames(Em) =c('0-5','0-10','0-15','0-20','0-25','0-30','0-35')

For the second table:

B1 = A %>%
  summarise( i0_5 = sum( (a >= 0) & (b>= 0 & b< 5) & (d >=0 & d<  5) ),
             i0_10 = sum( (a >= 0) & (b>= 0 & b< 5) & (d >=0 & d< 10) ),
             i0_15 = sum( (a >= 0) & (b>= 0 & b< 5) & (d >=0 & d< 15) ),
             i0_20 = sum( (a >= 0) & (b>= 0 & b< 5) & (d >=0 & d< 20) ),
             i0_25 = sum( (a >= 0) & (b>= 0 & b< 5) & (d >=0 & d< 25) ),
             i0_30 = sum( (a >= 0) & (b>= 0 & b< 5) & (d >=0 & d< 30) ),
             i0_35 = sum( (a >= 0) & (b>= 0 & b< 5) & (d >=0 & d<= 35) ) )

B1=as.data.frame(t(B1))

B2 = A %>%
  summarise( i0_5 = sum( (a >= 0) & (b>= 0 & b< 10) & (d >=0 & d<  5) ),
             i0_10 = sum( (a >= 0) & (b>= 0 & b< 10) & (d >=0 & d< 10) ),
             i0_15 = sum( (a >= 0) & (b>= 0 & b< 10) & (d >=0 & d< 15) ),
             i0_20 = sum( (a >= 0) & (b>= 0 & b< 10) & (d >=0 & d< 20) ),
             i0_25 = sum( (a >= 0) & (b>= 0 & b< 10) & (d >=0 & d< 25) ),
             i0_30 = sum( (a >= 0) & (b>= 0 & b< 10) & (d >=0 & d< 30) ),
             i0_35 = sum( (a >= 0) & (b>= 0 & b< 10) & (d >=0 & d<= 35) ) )

B2=as.data.frame(t(B2))

B3 = A %>%
  summarise( i0_5 = sum( (a >= 0) & (b>= 0 & b< 15) & (d >=0 & d<  5) ),
             i0_10 = sum( (a >= 0) & (b>= 0 & b< 15) & (d >=0 & d< 10) ),
             i0_15 = sum( (a >= 0) & (b>= 0 & b< 15) & (d >=0 & d< 15) ),
             i0_20 = sum( (a >= 0) & (b>= 0 & b< 15) & (d >=0 & d< 20) ),
             i0_25 = sum( (a >= 0) & (b>= 0 & b< 15) & (d >=0 & d< 25) ),
             i0_30 = sum( (a >= 0) & (b>= 0 & b< 15) & (d >=0 & d< 30) ),
             i0_35 = sum( (a >= 0) & (b>= 0 & b< 15) & (d >=0 & d<= 35) ) )

B3=as.data.frame(t(B3))

B4 = A %>%
  summarise( i0_5 = sum( (a >= 0) & (b>= 0 & b< 20) & (d >=0 & d<  5) ),
             i0_10 = sum( (a >= 0) & (b>= 0 & b< 20) & (d >=0 & d< 10) ),
             i0_15 = sum( (a >= 0) & (b>= 0 & b< 20) & (d >=0 & d< 15) ),
             i0_20 = sum( (a >= 0) & (b>= 0 & b< 20) & (d >=0 & d< 20) ),
             i0_25 = sum( (a >= 0) & (b>= 0 & b< 20) & (d >=0 & d< 25) ),
             i0_30 = sum( (a >= 0) & (b>= 0 & b< 20) & (d >=0 & d< 30) ),
             i0_35 = sum( (a >= 0) & (b>= 0 & b< 20) & (d >=0 & d<= 35) ) )

B4=as.data.frame(t(B4))

B5 = A %>%
  summarise( i0_5 = sum( (a >= 0) & (b>= 0 & b< 25) & (d >=0 & d<  5) ),
             i0_10 = sum( (a >= 0) & (b>= 0 & b< 25) & (d >=0 & d< 10) ),
             i0_15 = sum( (a >= 0) & (b>= 0 & b< 25) & (d >=0 & d< 15) ),
             i0_20 = sum( (a >= 0) & (b>= 0 & b< 25) & (d >=0 & d< 20) ),
             i0_25 = sum( (a >= 0) & (b>= 0 & b< 25) & (d >=0 & d< 25) ),
             i0_30 = sum( (a >= 0) & (b>= 0 & b< 25) & (d >=0 & d< 30) ),
             i0_35 = sum( (a >= 0) & (b>= 0 & b< 25) & (d >=0 & d<= 35) ) )

B5=as.data.frame(t(B5))

B6 = A %>%
  summarise( i0_5 = sum( (a >= 0) & (b>= 0 & b< 30) & (d >=0 & d<  5) ),
             i0_10 = sum( (a >= 0) & (b>= 0 & b< 30) & (d >=0 & d< 10) ),
             i0_15 = sum( (a >= 0) & (b>= 0 & b< 30) & (d >=0 & d< 15) ),
             i0_20 = sum( (a >= 0) & (b>= 0 & b< 30) & (d >=0 & d< 20) ),
             i0_25 = sum( (a >= 0) & (b>= 0 & b< 30) & (d >=0 & d< 25) ),
             i0_30 = sum( (a >= 0) & (b>= 0 & b< 30) & (d >=0 & d< 30) ),
             i0_35 = sum( (a >= 0) & (b>= 0 & b< 30) & (d >=0 & d<= 35) ) )

B6=as.data.frame(t(B6))

B7 = A %>%
  summarise( i0_5 = sum( (a >= 0) & (b>= 0 & b<= 35) & (d >=0 & d<  5) ),
             i0_10 = sum( (a >= 0) & (b>= 0 & b<= 35) & (d >=0 & d< 10) ),
             i0_15 = sum( (a >= 0) & (b>= 0 & b<= 35) & (d >=0 & d< 15) ),
             i0_20 = sum( (a >= 0) & (b>= 0 & b<= 35) & (d >=0 & d< 20) ),
             i0_25 = sum( (a >= 0) & (b>= 0 & b<= 35) & (d >=0 & d< 25) ),
             i0_30 = sum( (a >= 0) & (b>= 0 & b<= 35) & (d >=0 & d< 30) ),
             i0_35 = sum( (a >= 0) & (b>= 0 & b<= 35) & (d >=0 & d<= 35) ) )

B7=as.data.frame(t(B7))

Em2=cbind(B1,B2,B3,B4,B5,B6,B7)
colnames(Em2) =c('0-5','0-10','0-15','0-20','0-25','0-30','0-35')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!