问题描述
|
我需要合并来自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
-纳赛尔