如何根据另一个的长度匹配和修剪data.frame?

时间:2016-07-07 12:51:54

标签: r dplyr

我的实验包括通过两个不同的测量系统在10次演习(试验)期间测量因变量(距离)。有多个参与者(姓名)。我对每个系统如何测量距离感兴趣。但是,这两个系统每次钻孔的采样率和完成时间不同。

一个data.frame名为" Criterion"结构如下:

Source: local data frame [5 x 6]
Groups: Name, Trial [1]

       Trial   Name Sample Measure  Time    Distance
      (fctr) (fctr)  (int)  (fctr) (dbl)       (dbl)
1 D5_Sprint1   RUTH      1   CRITE 0.005          NA
2 D5_Sprint1   RUTH      2   CRITE 0.010 0.003429569
3 D5_Sprint1   RUTH      3   CRITE 0.015 0.003933275
4 D5_Sprint1   RUTH      4   CRITE 0.020 0.004403281
5 D5_Sprint1   RUTH      5   CRITE 0.025 0.004826486

另一个,"实践"如下:

Source: local data frame [5 x 6]
Groups: Name, Trial [1]

       Trial  Name Sample Measure     Distance  Time
       (chr) (chr)  (dbl)   (chr)        (dbl) (dbl)
1 D1_Sprint1  MARK      1    PRAC           NA  0.01
2 D1_Sprint1  MARK      2    PRAC 0.0012041589  0.02
3 D1_Sprint1  MARK      3    PRAC           NA  0.03
4 D1_Sprint1  MARK      4    PRAC 0.0009219522  0.04
5 D1_Sprint1  MARK      5    PRAC 0.0012165535  0.05

我可以使用下面的代码找到每个试验的结束时间,每个名称和相关的行号:

PracticalDrillTimes <- Practical %>% 
  mutate(Row = seq_along(Time)) %>% 
  group_by(Name, Trial) %>% slice(n())

Source: local data frame [5 x 7]
Groups: Name, Trial [5]

       Trial  Name Sample Measure    Distance  Time   Row
       (chr) (chr)  (dbl)   (chr)       (dbl) (dbl) (int)
1 D1_Sprint1  RUTH    656    PRAC 0.015959010  6.56   656
2 D1_Sprint1  MARK    576    PRAC 0.014603082  5.76   576
3 D1_Sprint2  RUTH    651    PRAC 0.005423099  6.51   651
4 D1_Sprint2  MARK    746    PRAC 0.021403738  7.46   746
5 D1_Sprint5  RUTH    621    PRAC 0.032652871  6.21   621

我对Criterion数据集重复上述内容。

Source: local data frame [5 x 7]
Groups: Name, Trial [5]

       Trial   Name Sample Measure  Time     Distance   Row
      (fctr) (fctr)  (int)  (fctr) (dbl)        (dbl) (int)
1 D1_Sprint1   RUTH   1041   CRITE 5.205 0.0002099668  1041
2 D1_Sprint1   MARK    944   CRITE 4.720 0.0002195038   944
3 D1_Sprint2   RUTH    985   CRITE 4.925 0.0002437823   985
4 D1_Sprint2   MARK    977   CRITE 4.885 0.0002515801   977
5 D1_Sprint3   RUTH   1149   CRITE 5.745 0.0002597051  1149

我现在希望修剪实用data.frame,以使较短的钻头长度与标准的钻头长度匹配,以便两个钻头具有相同的长度。例如,在实践中修剪Ruth的6.56秒长度钻头以匹配5.205长度。

我有时间结束每次练习,但是如何有效地匹配和修剪实用data.frame与适当的练习长度?

我知道我可以使用子集或删除特定行,但data.frame都是&gt; 100,000行的长度,因此快速解决方案将是理想的。谢谢!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望通过删除每个名称x试验的Time(Time_Practical,为清晰度)大于max(Time_Criterion)的行来修剪Practical。不是处理行号,一种方法是总结每个Name x Trial组合的max(Time),然后按如下方式加入和过滤:

CriterionDrillTimes <- Criterion %>%
  group_by(Name, Trial) %>%
  summarize(MaxTimeCriterion = max(Time))

PracticalJoin <- Practical %>% 
  left_join(CriterionDrillTimes, by = c('Name', 'Trial')) %>% 
  filter(Time <= MaxTimeCriterion)