【问题标题】:How to compare text strings in a table colum matlab如何比较表格列matlab中的文本字符串
【发布时间】:2017-04-12 13:09:20
【问题描述】:

如果我有一个 N×1 表列,如何检测任何行是否相同?

【问题讨论】:

  • 预期输出是多少?只是对/错?
  • 预期的输出是一个逻辑向量,在所有有重复值的地方都是假的,并且错误消息告诉哪一行有重复值

标签: matlab compare detection string-comparison


【解决方案1】:

如果您只是想确定是否存在重复行,您可以使用unique 来执行此操作。您可以检查列中唯一值的数量并将其与同一列中的元素总数(numel)进行比较

tf = unique(t.Column) == numel(t.Column)

如果要确定哪些行是重复的,可以再次使用unique,但使用第三个输出,然后使用accumarray计算每个值的出现次数,然后选择那些多次出现的值。

[vals, ~, inds] = unique(t.Column, 'stable'); 
repeats = vals(accumarray(inds, 1) > 1);

% And to print them out:
fprintf('Duplicate value: %s\n', repeats{:})

如果你想要一个 true/false 的逻辑向量来表示存在重复项的位置,你可以执行与上述类似的操作

[vals, ~, inds] = unique(t.Column, 'stable');
result = ismember(inds, find(accumarray(inds, 1) > 1));

或者

[vals, ~, inds] = unique(t.Column, 'stable');
result = sum(bsxfun(@eq, inds, inds.'), 2) > 1;

更新

您可以结合以上两种方法来完成您想要的。

[vals, ~, inds] = unique(t.Column, 'stable'); 
repeats = vals(accumarray(inds, 1) > 1);

hasDupes = numel(repeats) > 0;

if hasDupes
    for k = 1:numel(repeats)
        fprintf('Duplicate value: %s\n', repeats{k});
        fprintf('   Found at: ');
        fprintf('%d ', find(strcmp(repeats{k}, t.Column)));
        fprintf('\n');
    end
end

【讨论】:

  • 如果我使用这个代码: [vals, ~, inds] = unique(t.Column, 'stable');重复 = vals(accumarray(inds, 1) > 1);它返回重复的值,是否可以将其写入 for 循环,所以我可以让 matlab 打印一条错误消息,告诉哪一行有相同的值,并作为输出给出一个逻辑向量,每个值为 1唯一值,每个重复值都为 0?
  • 这几乎是我所需要的,抱歉一直问我真的不擅长编程,但现在它给了我一个逻辑向量,每次 1 都有一个相同的值,这不是我想要的想要它做。我有一个 csv 文件,然后我需要检测第一列中的任何数字是否相同,如果是这种情况,我需要打印一条错误消息,告诉哪一行有相同的值,然后删除复制,保留原件
  • 我能想到这样做的唯一原因是使用for循环,遍历每个列然后使用if语句,我只是不知道如何编写它
  • 这正是我想要的,感谢您花时间提供帮助,非常感谢!我还有一个小要求,是否可以让它打印在哪些行中存在重复值以及它已经打印的值,并将其变为逻辑向量而不是打印唯一值?
  • 最后一个问题是否可以对逻辑向量进行 vals 处理,该逻辑向量由每个唯一值 1 和每个重复值 0 组成,而不是打印值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多