使用函数从多个记录中提取相应的数据帧值

时间:2017-07-01 11:26:09

标签: r function dataframe

我有一个包含许多记录的数据帧(df1)每个记录最多有三个试验,每个试验最多可重复五次。以下是我的一些数据示例:

Record   Trial   Start    End    Speed     Number
     1       2       1      4       12         9
     1       2       4      6       11        10
     1       3       1      3       10        17
     2       1       1      5       14         5

我有以下代码计算每条记录的最长“距离”和“最大数量”。:

getInfo <- function(race_df) {
  race_distance <- as.data.frame(race_df %>% group_by(record,trial) %>% summarise(max.distance = max(End - Start)))
  race_max_number = as.data.frame(race_df %>% group_by(record,trial) %>% summarise(max.N = max(Number)))
  rd_rmn_merge <- as.data.frame(merge(x = race_distance, y = race_max_number)
  total_summary <- as.data.frame(rd_rmn_merge[order(rd_rmn_merge$trial,])
  return(list(race_distance, race_max_number, total_summary)
}

list_summary <- getInfo(race_df)
total_summary <- list_of_races[[3]]

list_summary给我一个这样的输出:

 [[1]]
 Record   Trial    Max.Distance  
      1       2       3       
      1       3       2     
      2       1       4      

 [[2]]
 Record    Trial    Max.Number
      1       2       10
      1       3       17
      2       1        5

 [[3]]
 Record  Trial    Max.Distance    Max.Number 
      1       2        3             10
      1       3        2             17
      2       1        4              5

我现在正试图寻找与相应“数字”的最长距离,无论它是否为最大值。所以有了记录1,试验2看起来像这样:

Record   Trial     Max.Distance  Corresponding Number
     1       2          3                9

最终我希望能够创建一个能够通过'race_df'数据框获取参数'Record'和'Trial'的功能,以便更轻松地搜索特定记录和试用的最长距离。

对此的任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:3)

数据(如果其他人想要提供他们的解决方案):

df <- data.frame( Record = c(1,1,1,2),
                  Trial = c(2,2,3,1),
                  Start = c(1,4,1,1),
                  End = c(4,6,3,5),
                  Speed = c(12,11,10,14),
                  Number = c(9,10,17,5))

这是一个整合的解决方案:

library(tidyverse)
df %>% 
  mutate( Max.Distance = End - Start) %>% 
  select(-Start,-End,-Speed) %>%
  group_by(Record) %>% 
  nest() %>% 
  mutate( data = map( data, ~ filter(.x, Max.Distance == max(Max.Distance)) )) %>% 
  unnest()

输出:

  Record Trial Number Max.Distance
   <dbl> <dbl>  <dbl>        <dbl>
1      1     2      9            3
2      2     1      5            4

请注意,如果您希望将所有列保留在最终数据框中,只需删除select...

答案 1 :(得分:2)

我希望我的功能应该是正确的。最后它应该记录和试验,并把我们有最大距离的行放出来,对吧? 因此,它归结为两个过滤器:

  1. 过滤记录和试用的行。
  2. 过滤该子集中具有最大距离
  3. 的行

    在这两个过滤器之间,我们必须计算距离,虽然我建议你把它移到函数外面,因为它基本上是一次性操作。

    race_df <- data.frame(Record = c(1, 1, 1, 2), Trial = c(2, 2, 3, 1),
                     Start = c(1, 4, 1, 1), End = c(4, 6, 3, 5), Speed = c(12, 11, 10, 14),
                     Number = c(9, 10, 17, 5))
    
    get_longest <- function(df, record, trial){
      df %>% 
        filter(Record == record & Trial == trial) %>% 
        mutate(Distance = End - Start) %>% 
        filter(Distance == max(Distance)) %>%
        select(Number, Distance)
    }
    get_longest(race_df, 1, 2)