【问题标题】:Iterating over groups of rows in separate data frames R迭代单独数据帧R中的行组
【发布时间】:2020-06-18 07:22:38
【问题描述】:

我有两个不同长度的不同数据框,看起来像这样(此处未显示所有行):

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$ 中最接近的较小数字脑电图。因此,新数据帧中的第一行将是 all_eeg 的第 90 行,因为它包含与 all_1p$Time 中属于同一记录的第一个索引最接近的较小数字。

我尝试编写一个循环,但有些问题。

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

我希望你能帮助我。

【问题讨论】:

    标签: r loops dataframe nested-loops


    【解决方案1】:

    我可以使用 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))
    
    • 第一步:通过每条记录找出最短时间
    • 步骤 2:左加入 all_eeg 的最短时间并找到时间和最短时间之间的时间差
    • 第 3 步:按每个记录过滤最低时间增量

    【讨论】:

    • 谢谢!我明白你在做什么。但是,我确实收到了一个错误:```` eval 中的错误(cols[[col]],.data,parent.frame()) :找不到对象 'Time' ``` 我尝试使用 dplyr::summarize ,但这似乎没有帮助。我不应该在 tidyverse 中指定 Time 属于哪个数据帧,对吧?喜欢所有_1p$时间
    【解决方案2】:

    我建议使用来自tidyverse 包集合的dplyr 来解决此类问题。此外,将来您可能希望以可直接复制粘贴到 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))
    

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多