我有一个包含许多记录的数据帧(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'的功能,以便更轻松地搜索特定记录和试用的最长距离。
对此的任何帮助都将非常感激。
答案 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)
我希望我的功能应该是正确的。最后它应该记录和试验,并把我们有最大距离的行放出来,对吧? 因此,它归结为两个过滤器:
在这两个过滤器之间,我们必须计算距离,虽然我建议你把它移到函数外面,因为它基本上是一次性操作。
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)