2014-12-04 48 views
2

比方说,我有一个这样的表:MATLAB - 在一个表中提取选定行基于一些标准

post user   date 
____ ____ ________________ 
1  A  12.01.2014 13:05 
2  B  15.01.2014 20:17 
3  A  16.01.2014 05:22 

我想创建一个较小的表包含的所有帖子(但不删除原有的一个!) - 例如 - 用户A,包括发布日期。

当看着MATLAB's documentation(请参阅删除行的最后一部分)时,我发现MATLAB允许您根据某些标准为表创建掩码。所以在我的情况下,如果我做这样的事情:

postsA = myTable.user == 'A' 

我得到一个不错的掩码矢量如下:

>> postsA = 
     1 
     0 
     1 

其中1S显然在那些行myTable的,满足我给出的规则。

在我已经指出,在上述行机制的文档从原始表中删除:

postsNotA = myTable.user ~= 'A' % note that I have to reverse the criterion since I'm choosing stuff that will be removed 
myTable(postsNotA,:) = []; 

不过,我想 - 上面说 - 喜欢不碰我的原始表。这里是一个可能的解决方案是创建一个空表有两列:

post date 
____ ____ 

interate通过我的原始表中的所有行,同时也看着我的面具矢量postsA的当前值,如果它等于1 ,复制我感兴趣的那一行中的两列,并将这个缩小的行连接到我的较小的表中。我想知道的是,如果这个问题的解决方案或多或少有1-2行的话?

+1

如何'表(t1.post(的strcmp(t1.user, 'A')),t1.date(的strcmp(t1.user, 'A'))) ','t1'是你原来的桌子? – Divakar 2014-12-04 17:35:42

+0

这将返回一个空表。由于我的数据集很大,我重新创建了与原始文章中相同的表格,以测试您的方式。你测试过了吗?如果是这样,你可以请你发布你的代码,以便我可以比较。 – rbaleksandar 2014-12-04 18:08:24

+0

感谢您的帮助! – rbaleksandar 2014-12-04 18:29:30

回答

4

假设myTable是您的原始表格。

你可以做

myTable(myTable.user == 'A',:) 

示例代码:

user = ['A';'B';'A';'C';'B']; 
Age = [38;43;38;40;49]; 
Height = [71;69;64;67;64]; 
Weight = [176;163;131;133;119]; 
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80]; 
T = table(user,Age,Height,Weight,BloodPressure) 
T(T.user=='A',:) 

给出:

T =

user Age Height Weight   BloodPressure  
____ ___ ______ ______ _________________________ 

A  38  71  176  124     93 
B  43  69  163  109     77 
A  38  64  131  125     83 
C  40  67  133  117     75 
B  49  64  119  122     80 

ANS =

user Age Height Weight   BloodPressure  
____ ___ ______ ______ _________________________ 

A  38  71  176  124     93 
A  38  64  131  125     83 
+0

这是一个更好的(在我的情况下也工作)的解决方案,但它包含我不想存储的“用户”列,因为 - 正如我在我原来的帖子中提到的 - 表将被存储在特定用户的结构中(在您的病例 - 患者中),这意味着提取表中的所有数据无论如何都是关于他/她的。我想这样做是为了节省资源(在我的数据集中谈论大约1 000 000个条目)。 我认为你可以在表的索引的列参数中使用一个范围。是否有可能为此目的使用列的变量名? – rbaleksandar 2014-12-04 18:09:20

+0

例如,T(T.user =='A',:2)将返回患者A的所有Age-entries。可以给出一个带有数字的范围,但我认为在我的情况下,它会更容易阅读和处理if我只是列出了我想要提取的列(类似于@Divakar发布的评论) – rbaleksandar 2014-12-04 18:16:48

+0

我编辑了您的答案以添加其他信息。 – rbaleksandar 2014-12-04 18:29:15