Итерация по группам строк в отдельных фреймах данных R - PullRequest
0 голосов
/ 18 июня 2020

У меня есть два разных фрейма данных разной длины, которые выглядят примерно так (здесь показаны не все строки):

all_eeg

       EEG    Recording
88     55.746      AA00
89     56.277      AA00
90     56.738      AA00
91     57.159      AA00
92     57.550      AA00
93     57.817      AA00

1549   51.001      AB00
1550   51.504      AB00
1551   51.609      AB00
1552   52.080      AB00
1553   52.461      AB00
1554   52.977      AB00
1555   53.366      AB00

6260 1000.644      AF01
6261 1000.745      AF01
6262 1001.800      AF01
6263 1002.180      AF01
6264 1003.333      AF01
6265 1004.230      AF01


all_1p

         Time LFP_Latency LFP_Amplitude Peak_LFP_Length Recording Electrode
1     57.1184     7.11995        -0.414         8.46697      AA00         1
2    123.3470     5.32393        -0.018         5.00321      AA00         1
3    191.0920    10.58370        -0.426         5.38807      AA00         1
4    249.1710     4.49006        -0.042         5.25978      AA00         1
5    325.5090     7.11995        -0.486         7.69724      AA00         1
6    385.6040     5.77293        -0.012         4.04105      AA00         1

131    51.730     8.86496      -1.22667         5.71567      AB00         1
132   117.684     8.62209      -2.56667         3.93459      AB00         1
133   184.974     8.20110      -3.51333         3.62694      AB00         1
134   242.875     7.39152      -3.50667         4.77655      AB00         1
135   319.604     7.42390      -2.74667         4.30699      AB00         1
136   379.350     8.81639      -1.06000         5.97474      AB00         1
137   430.632    10.74320      -1.81333         4.19365      AB00         1

296 1003.4300     4.09302      -1.90800         7.93798      AF01         2
297 1072.0500    11.16280      -2.48400         5.76744      AF01         2
298 1132.8900     8.93023      -1.39200         7.19380      AF01         2
299 1197.8800     6.63566      -1.03200        10.35660      AF01         2
300 1259.2800    10.23260      -2.98800         8.18605      AF01         2
301   61.8331    10.03750      -2.08600         5.25328      AF02         2

Я хочу создать новый фрейм данных (или удалить строки из all_eeg). Строки, которые я хочу «сохранить», должны быть основаны на числе из all_eeg $ EEG, которое является ближайшим меньшим числом к ​​каждому из чисел в all_1p $ Time тогда и только тогда, когда они принадлежат одной и той же записи. Итак, я думаю, что код сначала должен перебирать строки в all_1p $ Recording и искать строки в all_eeg $ Recording с одинаковыми значениями, затем перебирать индексы в all_1p $ Time и затем определять ближайшее меньшее число в all_eeg $ ЭЭГ. Таким образом, первая строка в новом фрейме данных будет строкой 90 из all_eeg, потому что она содержит ближайшее меньшее число к первому индексу в all_1p $ Time, принадлежащем той же записи.

Я попытался написать al oop, но что-то не так.

pre_eeg_list <- c()

for(i in 1:nrow(all_1p)){
   if(all_1p$Recording[i] == all_eeg$Recording){
    pre_eeg_list[i] <- max(all_eeg$EEG[all_1p$Time[i] >= all_eeg$EEG]) 
  }
} 

Надеюсь, вы мне поможете.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Я бы предложил использовать dplyr из коллекции tidyverse пакетов для такого рода проблем. Кроме того, в будущем вы, возможно, захотите предоставить данные примера в формате, который можно напрямую скопировать и вставить в R. Я не тестировал его, но что-то вроде этого должно решить вашу проблему.

library(tidyverse)

all_eeg %>%
    inner_join(all_1p, by = "Recording") %>%
    mutate(t_diff = Time - EEG) %>%
    group_by("Recording", "Time") %>%
    filter(t_diff == min(t_diff))
0 голосов
/ 18 июня 2020

Я мог бы легко справиться с пакетом dplyr.

> Library(dplyr) 
> all_eeg %>%  left_join(all_1p %>% group_by(Recording) 
> %>% summarize(min_time = min(Time)) ) %>% mutate(time_delta = Time -
> min_time) %>% group_by(Recording) %>% filter(time_delta =
> min(time_delta))
  • Шаг 1: Найдите минимальное время для каждой записи
  • Шаг 2: Оставьте минимальное время соединения с all_eeg и найдите разницу во времени между временем и минимальным временем
  • Шаг 3. Отфильтруйте минимальную разницу во времени по каждой записи
...