我需要合并来自两个不同来源的数据。下表说明了我的内容:
所需的输出:
这个想法是:
查看第一个col。表1(TrialNO)
在第一个col中查找它。表2。
检查第二列中的值。是平等的 (实际上那些col。不会位于2个列表中的相同位置)
如果检查通过,则附加位于col的值。 3& 4(Cond1& Cond2)到表2中的行。
我认为我不会将标题保留在真实结构中,所以它不应该代表一个额外的问题,但欢迎处理标题的建议(是否删除它们并将它们存储在其他地方或处理他们以特殊的方式)
**
**
我将介绍如何获取这些数据以阐明其形状。我相信它可以用更精确的方式在技术上进行描述。请不要犹豫纠正我。
我正在录制眼球运动(眼跳和固定),并且受试者在屏幕上显示刺激时回答任务。
我从两个不同来源获取这些数据:
-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个显示器。
- 一些类似的信息(显示号码(1到400),用于合并2,条件号码,可用于检查映射赌注.2)
然后是大量描述眼球运动的变量:
- 固定和扫视持续时间,位置,时间等(约100列)
在这个矩阵中,每一行都是固定。 然后在列中提供扫视特征(上一个和下一个扫视)并且可以有1到30个每个显示50个固定。结果,我可以为第一个显示器提供19行数据,为第二个显示器提供5行数据。
第一步是合并2和2数据结构,以获得一个大的,每行对应一个固定。
必须为每个主题执行此操作,然后将主题数据聚合在一起。
这是我后来处理这个怪物的计划(这将解释我在其他问题中的需求):
提取标题&列号。
以漂亮的表格形式按组显示 - 一般信息(试用ID,条件,主题ID ......), -Display Info(屏幕上对象的坐标), -Fixations info等...
每个变量都包含数据类型(字符串,数字,文本)的摘要,范围,列的不同值以及一些基本的描述性统计信息。
有条件地提取此部分内容的系统(例如:提取条件编号,注视持续时间,由特定主题选择的显示) 这样我就可以提取一些定义良好的表格,然后在不触及原始数据的情况下运行我的分析。
如果我使用我的精确情况来表达我的问题,我相信,这可以产生一个很好的高效且图形化的易用工具来处理大量数据集。
答案 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个列表中的相同位置)
因此,这可能具有太多或太少的特异性。
目前sp
必须是两个索引(列号)的列表,因为这样会使事情变得更简单,我不确定你想要什么。您想指定哪些元素来自data1
并附加到data2
,还是应该是比较后的所有元素,还是其他内容?
如果si
,ti
,sp
有标准值,则可以添加默认值,以便省略这些值,除非需要不同的值。
我认为可以扩展与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
- 纳赛尔