Data structures Mathematica中的条件数据合并

Data structures Mathematica中的条件数据合并,data-structures,merge,wolfram-mathematica,conditional,Data Structures,Merge,Wolfram Mathematica,Conditional,我需要合并来自两个不同来源的数据。下表说明了我的情况: 以及所需的输出: 这个想法是: 查看表1的第一列(TrialNO) 请在表2的第一列中查找 检查第二列中的值是否相等 (实际上,这些列不会位于两个列表中的相同位置) 如果检查通过,将第3列和第4列(第1列和第2列)中的值附加到表2中的行中 我不认为我会将标题保留在真实的结构中,因此它不应该代表一个额外的问题,但是处理标题的建议是受欢迎的(是否将它们删除并存储在其他地方,或者以特殊的方式处理它们) ** 编辑:对我的数据和我的目标的形

我需要合并来自两个不同来源的数据。下表说明了我的情况:

以及所需的输出:

这个想法是:

  • 查看表1的第一列(TrialNO)

  • 请在表2的第一列中查找

  • 检查第二列中的值是否相等 (实际上,这些列不会位于两个列表中的相同位置)

  • 如果检查通过,将第3列和第4列(第1列和第2列)中的值附加到表2中的行中

  • 我不认为我会将标题保留在真实的结构中,因此它不应该代表一个额外的问题,但是处理标题的建议是受欢迎的(是否将它们删除并存储在其他地方,或者以特殊的方式处理它们)

**

编辑:对我的数据和我的目标的形状给予精确性 **

我将提供一些背景资料,说明我是如何获得这些数据以澄清其形状的。我相信可以用更准确的技术来描述它。请随时纠正我

我正在记录眼球运动(扫视和注视),受试者在屏幕上显示刺激时回答任务。

  • 每次试验包括两次连续显示,每次显示3秒。它是一个2AFC(两个可选的强制选择)
  • 每个显示器都包含一个框架(约为屏幕大小的1/4),其中包含8个形状,在屏幕的4个象限中显示1个
  • 框架本身的构成有5个条件,因此每次试验可能有10个条件(1个框架条件与另一个框架条件不重复)
  • 有两种测量方法:对象的选择和观察刺激时记录的眼动
我从两个不同的来源获得这些数据:


  • 提供以下功能的“显示”机器
-试用号/显示号

-关于屏幕的信息

-条件

-主题答案

-X&Y坐标以及构成所显示刺激的11个对象的大小

在这个矩阵中,每一行都是一个显示,因此DisplayNO列从1到400(1,2,3,4,…,400),而TrialNO列实际上从1到200(1,1,2,2,…,200200) 因为每个试验有2次显示


  • “眼球跟踪”机器提供:
-一些类似的信息(显示编号(1到400),用于合并2,条件编号,可用于检查映射赌注。2)

然后是大量描述眼球运动的变量:

-注视和扫视持续时间、位置、时间等(约100列)

在此矩阵中,每一行都是一个固定点。然后在列中给出扫视特征(上一次和下一次扫视),每个显示可以有1到30-50个固定点。因此,第一次显示可以有19行数据,第二次显示可以有5行数据


  • 第一步是合并2-2数据结构,以获得一个大数据结构,每行对应一个固定

  • 必须对每个受试者执行此操作,然后将受试者数据聚合在一起

这是我以后处理这个怪物的计划(这将在其他问题中解释我的需求):

  • 提取标题和列编号

  • 以漂亮的表格形式分组展示 -一般信息(试验ID、条件、受试者ID…), -显示信息(屏幕上对象的坐标), -固定信息等

  • 为每个变量提供数据类型(字符串、数字、文本)、范围、列采用的不同值以及一些基本描述性统计信息的摘要

  • 有条件地提取该集合部分的系统(例如:提取条件编号、定影持续时间,以供特定主题选择显示) 这样,我提取了一些定义良好的表,然后在不接触原始数据的情况下运行分析

如果我用我的确切情况来说明我的问题,我相信,这可能会产生一个很好的、高效的、图形化的、易于使用的工具来处理大量的数据集。

这里有一种可能性:

MergeTables[data1_, data2_, samepos1_, samepos2_] :=
 Cases[data1, 
  x_ :> Block[{y = 
      Cases[data2, z_ /; z[[samepos2]] === x[[samepos1]]]},
    Apply[Sequence, Join[x, Delete[#, Thread[{samepos2}]]] & /@ y]]]
用法:

MergeTables[data2, data1, {1, 2}, {1, 2}]

萨沙的回答太酷了,我甚至不知道它是如何工作的

这是我的尝试,作为一个结构多于功能的程序员,我使用了一个表[](OMG!)来完成它。表[]仍然处于函数式编程的边缘:)

(这里A是数据2,B是数据1)


--纳赛尔

我等待对您的数据进行更详细的描述,以便更好地进行优化

checkMerge[src_, trg_, si_, ti_, sp_] :=
 Module[{rls, ext},
  rls = #[[si]] -> #[[sp]] & /@ src;
  AppendTo[rls, _ -> {,}];
  ext = Replace[trg[[All, ti]], Dispatch@rls, 1];
  ArrayFlatten[{{trg, ext}}]
 ]
语法是:

  • src
    =“源”列表(数据1)
  • trg
    =“目标”列表(数据2)
  • si
    =要比较的源索引列表
  • ti
    =要比较的目标索引列表
  • sp
    =从源添加到目标的索引列表
例如,这将是:

checkMerge[data1, data2, {1,2}, {1,2}, {3,4}]

我不得不从以下方面猜测变化的程度:

(实际上,这些列不会位于两个列表中的相同位置)

因此,这可能具有太多或太少的特异性

  • 目前,
    sp
    必须是一个包含两个索引(列号)的列表,因为这使事情变得更简单,我不确定您想要什么。您想指定哪些元素取自
    data1
    并附加到
    data2
    ,还是应该是比较后的所有元素,还是其他元素

  • 如果有
    si
    ti
    sp
    的标准值,则可以添加默认值,以便您可以忽略这些值,除非需要不同的值
    checkMerge[data1, data2, {1,2}, {1,2}, {3,4}]