根据R中的匹配值的数据帧子集

时间:2017-07-11 13:56:00

标签: r dataframe subset

我有data.frame有关于赛马表现的信息。我有一个变量Competition.year,其中有一个“Total”行,然后是每年匹配的一行。我还有一个变量Competition.age,用于描述马匹在每个特定年份的年龄。

我正在尝试根据他们的最佳赛车时间和他们达到目标时的年龄来创建子集df。在“总计”行中,包括的比赛时间是他们最好的。所以,我需要弄清楚如何告诉R,当Total row中的比赛时间等于他们实际达到那个时间的时候,包括他们当时在新数据框中的年龄。我是R的新手,所以我不知道在哪里开始这样做,我已经尝试了一些我在其他问题上看过的东西,但我无法做到。任何帮助将不胜感激!

我的df看起来像这样:

travdata <- data.frame(
"Name"=c(rep("Muuttuva",3),rep("Pelson Poika",7),rep("Muusan Muisto",4)),
"Competition.year" = c("Total",2005,2004,"Total",2003,2004,2006,2005,2002,2001,2008,2010,"Total",2009), 
"Time.record.auto.start"=c(93.5,NA,93.5,96.5,NA,NA,104.2,96.5,NA,96.6,NA,NA,NA,NA), 
"Time.record.volt.start"=c(92.5,98.4,92.5,94.3,NA,105.3,98.3,94.3,102.1,99.1,107.5,NA,107.5,NA),
"Competition.age"=c(NA,6,7,NA,4,5,6,7,8,9,NA,5,6,7))

所需的df应该有223行(因为这是我拥有的总马匹数),其中列NameCompetition.year=="Total"Time.record.auto.start,{{1} }和Time.record.volt.start

1 个答案:

答案 0 :(得分:0)

首先,我必须更改您的样本数据,以确保所有5个变量每个只有14个观察值。我是通过移除NA变量中的最终Competition.age来完成此操作的。我还必须更换94.3变量中的98.3Time.record.volt.start值,以便这些值与Total列中与{ {1}}等于Name

以下是更正的数据:

Pelson Poika

这是一个简单的travdata <- data.frame( "Name"=c(rep("Muuttuva",3),rep("Pelson Poika",7),rep("Muusan Muisto",4)), "Competition.year" = c("Total",2005,2004,"Total",2003,2004,2006,2005,2002,2001,2008,2010,"Total",2009), "Time.record.auto.start"=c(93.5,NA,93.5,96.5,NA,NA,104.2,96.5,NA,96.6,NA,NA,NA,NA), "Time.record.volt.start"=c(92.5,98.4,92.5,94.3,NA,105.3,98.3,94.3,102.1,99.1,107.5,NA,107.5,NA), "Competition.age"=c(NA,6,7,NA,4,5,6,7,8,9,NA,5,6,7)) 解决方案,我认为这可以做你想要的。

dplyr

数据框library(dplyr) df1 <- travdata %>% group_by(Name) %>% filter(Competition.year == "Total") %>% select(Name, Time.record.auto.start, Time.record.volt.start) df2 <- travdata %>% filter(Competition.year != "Total") df3 <- inner_join( df1, df2, by = c( "Name" = "Name", "Time.record.auto.start" = "Time.record.auto.start", "Time.record.volt.start" = "Time.record.volt.start" ) ) 应该返回您所追求的内容。