Mathematica中的条件数据合并

时间:2011-05-26 16:23:15

标签: data-structures merge wolfram-mathematica conditional

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

enter image description here

所需的输出:

enter image description here

这个想法是:

  • 查看第一个col。表1(TrialNO)

  • 在第一个col中查找它。表2。

  • 检查第二列中的值。是平等的 (实际上那些col。不会位于2个列表中的相同位置)

  • 如果检查通过,则附加位于col的值。 3& 4(Cond1& Cond2)到表2中的行。

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

**

编辑:精确确定数据的形状和数据。我的目标

**

我将介绍如何获取这些数据以阐明其形状。我相信它可以用更精确的方式在技术上进行描述。请不要犹豫纠正我。

我正在录制眼球运动(眼跳和固定),并且受试者在屏幕上显示刺激时回答任务。

  • 每个试验包括两个连续的显示,每个显示3秒。它是2AFC(两种替代强制选择)。
  • 每个显示器包括一个框架(大约1/4尺寸的屏幕),其中有8个形状,显示在屏幕的4个象限中的1个。
  • 框架本身的构成有5个条件,因此每个试验可能有10个条件(框架与另一个框架的条件不重复)。
  • 有两个措施:选择主题&观察刺激时记录的眼球运动。

我从两个不同来源获取这些数据:


  • 提供
  • “显示”机器

-Trial number / Display number

- 关于屏幕的信息

-Conditions

- 主题答案

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

在此Matrix中,每一行都是一个显示 ,因此DisplayNO列将从1到400(1,2,3,4,...,400) )TrialNO列实际上从1到200(1,1,2,2,...,200,200) 因为每次试验有2个显示器。


  • “Eye-Tracking”机器,提供:

- 一些类似的信息(显示号码(1到400),用于合并2,条件号码,可用于检查映射赌注.2)

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

- 固定和扫视持续时间,位置,时间等(约100列)

在这个矩阵中,每一行都是固定。 然后在列中提供扫视特征(上一个和下一个扫视)并且可以有1到30个每个显示50个固定。结果,我可以为第一个显示器提供19行数据,为第二个显示器提供5行数据。


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

  • 必须为每个主题执行此操作,然后将主题数据聚合在一起。

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

  • 提取标题&列号。

  • 以漂亮的表格形式按组显示 - 一般信息(试用ID,条件,主题ID ......), -Display Info(屏幕上对象的坐标), -Fixations info等...

  • 每个变量都包含数据类型(字符串,数字,文本)的摘要,范围,列的不同值以及一些基本的描述性统计信息。

  • 有条件地提取此部分内容的系统(例如:提取条件编号,注视持续时间,由特定主题选择的显示) 这样我就可以提取一些定义良好的表格,然后在不触及原始数据的情况下运行我的分析。

如果我使用我的精确情况来表达我的问题,我相信,这可以产生一个很好的高效且图形化的易用工具来处理大量数据集。

3 个答案:

答案 0 :(得分:5)

这是一种可能性:

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}]

答案 1 :(得分:2)

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

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 =“来源”列表(data1)
  • trg =“目标”列表(data2)
  • si =从源到比较的索引列表
  • ti =来自目标的比较列表
  • sp =从源到附加到目标的索引列表

对于您的示例,这将是:

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

我必须猜测适应的变化程度:

  

(实际上那些col。不会位于2个列表中的相同位置)

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

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

  2. 如果sitisp有标准值,则可以添加默认值,以便省略这些值,除非需要不同的值。

  3. 我认为可以扩展与Null不匹配的行来创建矩形数组;如果这是你的愿望,可以在之后删除这些以产生一个参差不齐的数组。

答案 2 :(得分:1)

Sasha的回答太酷了,我甚至不知道它是如何运作的。

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

这里A是data2,B是data1

n=Length[A];  m=Length[B];

isMatch[a_,b_] := a[[1]]=== b[[1]]&&a[[2]]===b[[2]]

A[[1]] = A[[1]]~Join~B[[1,3;;-1]]; (*do the header on its own*)

Table[If[ isMatch[B[[i]],A[[j]]], 
          A[[j]] = Join[A[[j]],B[[i,3;;-1]]] 
     ],

     {i,2,m},{j,2,n}        
];

A//TableForm

- 纳赛尔

相关问题