Mathematica中的条件数据合并

问题描述

| 我需要合并来自2个不同来源的数据。下表说明了我所拥有的: 和所需的输出: 这个想法是: 看看第一列。表1(TrialNO) 在第一栏寻找它。表2。 检查第二个列中的值。相等 (实际上,这些列不会位于2个列表中的相同位置) 如果Check通过,则附加位于col的值。 3和4(Cond1和Cond2)到表2中的行。 我认为我不会将标头保留在实际的结构中,因此它不应代表其他问题,但是欢迎您处理标头的建议(无论是删除标头并将其存储在其他位置还是以特殊方式处理它们) ) ** 编辑:在我的数据和目标的形状上提供精确度 ** 我将对如何获取这些数据以阐明其形状提供一些背景知识。我相信可以从技术上更准确地描述它。请不要犹豫,纠正我。 我正在记录眼睛的动作(扫视和注视),并且受试者在屏幕上显示刺激的同时回答任务。 每个试验由两个连续的显示组成,每个显示3秒。它是2AFC(两种选择的强制选择)。 每个显示都包含一个显示框(约占屏幕大小的1/4),其中有8个形状,显示在屏幕的4个象限中的1个象限中。 框架本身的构成有5个条件,因此每次试验可能有10个条件(1个条件与另一个条件无重复)。 有两种测量方法:选择对象和在观察刺激时记录的眼球运动。 我从2个不同的来源获得这些数据: 提供的“显示”机器 -试用编号/显示编号 -有关屏幕的信息 -条件 -主题答案 -X和Y坐标以及组成所显示刺激的11个对象的大小。 在此矩阵中,每一行都是一个Display,因此DisplayNO列将从1变为400(1,2,3,4,...,400),而TrialNO列实际上从1变为200(1,1,2 ,2,..,200,200) 因为每个审判有2个显示器。 “眼动追踪”机器提供: -一些类似的信息(显示编号(1到400),将用于合并2,条件编号,可用于检查映射投注。2) 然后是描述眼睛运动的大量变量: -修复和扫视的持续时间,位置,时间等(约100列) 在此矩阵中,每一行都是一个注视。然后在列(上一个和下一个扫视)中给出扫视特性,每个显示可能有1到30-50个注视。结果,我可能在第一个显示中有19行数据,而在第二个显示中有5行数据。 第一步是合并2 2 2数据结构,以获得一个大结构,每行对应一个固定。 将必须对每个主题都执行此操作,然后将主题数据相互汇总。 这是我以后处理这个怪物的计划(这将在其他问题中解释我的需求): 提取标题和列号。 按小组以漂亮的表格形式展示它们 -常规信息(试验ID,条件,主题ID ...), -显示信息(屏幕上对象的坐标), -修复信息等... 对于每个变量,都有数据类型(字符串,数字,文本),范围,列采用多少个不同值以及一些基本描述性统计的摘要。 一个有条件地提取此集合的部分的系统(例如:提取条件编号,注视时间,以供特定对象选择显示) 这样,我就可以提取一些定义明确的表,然后在不影响原始数据的情况下进行分析。 如果我使用我的精确情况来提出我的问题,我相信,这可能会产生一个很好的,高效且易于使用图形的工具来处理大量数据集。     

解决方法

我正在等待您对数据进行更详细的描述,以便更好地进行优化。
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
= \“ target \”列表(数据2)
si
=来自源的索引列表以进行比较
ti
=要比较的目标的索引列表
sp
=从源到目标的索引列表 对于您的示例,这将是:
checkMerge[data1,data2,{1,2},{3,4}]
我不得不猜测要适应的更改级别:   (实际上,这些列不会位于2个列表中的相同位置) 因此,这可能具有太多或太少的特异性。 目前,
sp
必须是两个索引(列号)的列表,仅因为这会使事情变得简单一些,而且我不确定您想要什么。您是否要指定哪些元素是从
data1
提取并追加到
data2
,还是应该是所有被比较元素之后的元素,还是其他? 如果存在
si
ti
sp
的标准值,则可以添加默认值,以便您可以省略这些值,除非需要其他值。 我认为可以扩展与
Null
不匹配的行以创建矩形数组。如果您愿意的话,可以将它们删除,以产生一个破烂的数组。     ,这是一种可能性:
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,2}]
    ,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,n}        
];

A//TableForm
-纳赛尔     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...