Условное объединение данных в Mathematica - PullRequest
3 голосов
/ 26 мая 2011

Мне нужно объединить данные из 2 разных источников . Таблицы ниже иллюстрируют то, что у меня есть:

enter image description here

И желаемый вывод:

enter image description here

Идея такова:

  • Посмотрите на первый столбец. Таблицы1 (TrialNO)

  • Ищите его в первом столбце. таблицы 2.

  • Убедитесь, что значения во втором столбце. равны (в действительности эти столбцы не будут расположены в тех же местах в 2 списках)

  • Если проверка прошла успешно, добавьте значения, расположенные в пол. 3 и 4 (Cond1 & Cond2) к строке в таблице 2.

  • Не думаю, что я сохраню заголовки в реальной структуре, поэтому это не должно представлять дополнительную проблему, но приветствуются предложения по работе с заголовками (удалять их и хранить в другом месте или обрабатывать их особым образом)

**

РЕДАКТИРОВАТЬ: Предоставление точной формы моих данных и моих целей

**

Я немного расскажу, как получить эти данные, чтобы уточнить их форму. Я уверен, что технически это можно описать более точно. Пожалуйста, не стесняйтесь меня поправлять.

Я записываю движения глаз (саккады и фиксации), и испытуемые отвечают на задание при отображении стимулов на включенном экране.

  • Каждое испытание состоит из двух последовательных дисплеев по 3 секунды каждый. Это 2AFC (принудительный выбор с двумя альтернативами).
  • Каждый дисплей состоит из представления кадра (размером примерно 1/4 экрана) с 8 фигурами в нем, отображаемого в 1 из 4 квадрантов экрана.
  • Существует 5 условий того, из чего сделан сам кадр, и, таким образом, 10 условий возможны для каждого испытания (1 условие кадра против другого без повторения).
  • Существует 2 такта: выбор объекта и движения глаз, записанные при взгляде на стимулы.

Я получаю эти данные из 2 разных источников:


  • "дисплей" машина , которая обеспечивает

- Пробный номер / Дисплей номер

-Информация об экране

-условия

- Тема ответа

-X & Y координата, а также размер 11 объекта, составляющего отображаемые стимулы.

В этой матрице каждая строка является дисплеем , поэтому столбец 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, чтобы получить большую структуру с каждой строкой, соответствующей фиксации.

  • Придется сделать это для каждого предмета, а затем объединить данные предметов друг на друга.

Это мой план покончить с этим монстром позже (и это объяснит мои потребности в других вопросах):

  • Извлечь номер заголовка и столбцов.

  • Представьте их по группе в виде красивой таблицы Общая информация (идентификатор испытания, условие, идентификатор субъекта ...), -Отображение информации (координаты объектов на экране),Информация о фиксациях и т.д ...

  • Для каждого из этих переменных есть сводная информация о типе данных (строка, число, текст), диапазон, сколько различных значений принимает столбец инекоторая базовая описательная статистика.

  • Система для извлечения частей этого набора условно (например: Извлечение номера условия, продолжительности фиксаций для выбранного отображения по конкретному предмету) Таким образом я извлекаюнекоторую четко определенную таблицу, по которой я затем запускаю свой анализ, не касаясь исходных данных.

Если бы я использовал свою точную ситуацию, чтобы представить свою проблему, я полагаю, это могло бы дать хороший эффективный и графическипростой в использовании инструмент для работы с большим количеством данных в целом.

Ответы [ 3 ]

5 голосов
/ 26 мая 2011

Вот возможность:

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}]
2 голосов
/ 27 мая 2011

Жду более подробного описания ваших данных для лучшей оптимизации.

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

Мне нужно было угадать уровень изменений для:

(на самом деле эти столбцы не будут находиться в тех же местах в 2 списках)

Следовательно, это может иметь слишком много или слишком мало специфичности.

  1. В настоящее время sp должен быть списком из двух индексов (номеров столбцов) только потому, что это немного упростило ситуацию, и я не уверен, что вы хотите. Вы хотите указать, какие элементы взяты из data1 и добавлены к data2, или это должны быть все элементы после сравниваемых или что-то еще?

  2. Если есть стандартные значения для si, ti, sp, можно добавить значения по умолчанию, так что вы можете их пропустить, если не требуются другие значения.

  3. Я предположил, что можно расширять строки, которые не совпадают с Null, чтобы создать прямоугольный массив; впоследствии они могут быть удалены для создания рваного массива, если вы этого хотите.

1 голос
/ 27 мая 2011

Ответ Саши слишком классный, я даже не знаю, как он работает.

Вот моя попытка, и, будучи структурным, а не функциональным программистом, я использовал Table [] (OMG!) Для этого. Ну, а Table [] все еще на грани функционального программирования:)

( Здесь A - данные2, а B - данные1 )

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

- Насер

...