返回最后一行数据帧 - 重复变量名称

时间:2014-08-05 10:45:21

标签: r extract aggregate plyr

我想返回数据帧的每个子部分的最后一行。我知道ddply和聚合函数,但在这种情况下它们没有给出预期的输出,因为我拆分数据的列有重复的名称。

例如,在df中:

year <- rep(c(2011, 2012, 2013), each=12)
season <- rep(c("Spring", "Summer", "Autumn", "Winter"), each=3)
allseason <- rep(season, 3)
temp <- rnorm(36, mean = 61, sd = 10)
df <- data.frame(year, allseason, temp)

我想在每个季节结束时返回最后的临时读数。我跑的时候

final1 <- aggregate(df, list(df$allseason), tail, 1)

final2 <- ddply(df, .(allseason), tail, 1)

我只获得最后4个赛季(即2013年赛季)。功能似乎停在那里,并没有回到往年/季节。我的预期输出是一个12行* 3列的数据框。

所有帮助表示赞赏!

*我注意到在这里创建的df中,allseasons列被指定为具有4个级别的因子,而在我的原始数据帧中则不是这样。

2 个答案:

答案 0 :(得分:3)

在你的ddply代码中,你只忘了按年分组:

使用plyr

library(plyr)
ddply(df, .(year, allseason), tail, 1)

dplyr

library(dplyr)
df %>%
  group_by(year, allseason) %>%
  do(tail(.,1))

或者,如果您想要基础R替代方案,可以使用ave

df[with(df, ave(year, list(year, allseason), FUN = seq_along)) == 3,]

结果:

#   year allseason     temp
#1  2011    Autumn 63.40626
#2  2011    Spring 59.69441
#3  2011    Summer 42.33252
#4  2011    Winter 79.10926
#5  2012    Autumn 63.14974
#6  2012    Spring 60.32811
#7  2012    Summer 67.57364
#8  2012    Winter 61.39100
#9  2013    Autumn 50.30501
#10 2013    Spring 61.43044
#11 2013    Summer 55.16605
#12 2013    Winter 69.37070

请注意,输出在每种情况下都包含相同的行,只有顺序可能不同。

答案 1 :(得分:3)

只是为了添加@ beginneR的答案,您的aggregate解决方案应如下所示:

aggregate(temp ~ allseason + year, data = df, tail, 1)
# or:
with(df, aggregate(temp, list(allseason, year), tail, 1))

结果:

   allseason year     temp
1     Autumn 2011 64.51539
2     Spring 2011 45.14341
3     Summer 2011 62.29240
4     Winter 2011 47.97461
5     Autumn 2012 43.16781
6     Spring 2012 80.02419
7     Summer 2012 72.31149
8     Winter 2012 45.58344
9     Autumn 2013 55.92607
10    Spring 2013 52.06778
11    Summer 2013 51.01308
12    Winter 2013 53.22452