【问题标题】:MATLAB - extract selected rows in a table based on some criterionMATLAB - 根据某些标准提取表中的选定行
【发布时间】:2017-08-09 22:33:40
【问题描述】:

假设我有一张这样的桌子:

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 的所有帖子(例如,用户 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
____  ____

遍历我的原始表的所有行,同时查看我的掩码向量 postsA 的当前值,如果它等于 1,则复制我在该行中的两列我对这个缩小的行感兴趣并将其连接到我的小桌子上。我想知道这个问题是否有或多或少 1-2 行长的解决方案?

【问题讨论】:

  • table(t1.post(strcmp(t1.user,'A')),t1.date(strcmp(t1.user,'A'))) 怎么样,t1 是您的原始表格?
  • 这将返回一个空表。由于我的数据集很大,我重新创建了与原始帖子中相同的表,以测试您的方式。你测试过吗?如果是这样,请您发布您的代码以便我进行比较。
  • 感谢您的帮助!

标签: matlab datatable extract subset


【解决方案1】:

假设 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

【讨论】:

  • 这是一个更好的(在我的情况下也有效)解决方案,但是它包含我不想存储的“用户”列,因为 - 正如我在原始帖子中提到的 -该表将存储在该特定用户(在您的情况下为患者)的结构中,这意味着提取的表中的所有数据无论如何都是关于他/她的。我想这样做是为了节省资源(在我的数据集中谈论大约 1 000 000 个条目)。我想你可以在表索引的列参数中使用一个范围。是否可以为此目的使用列的变量名?
  • 例如 T(T.user=='A',:2) 将返回患者 A 的所有年龄条目。可以给出一个数字范围,但我认为在我的情况下它会如果我简单地列出我想要提取的列(类似于@Divakar 作为评论发布的内容),则更易于阅读和处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多