我想返回数据帧的每个子部分的最后一行。我知道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个级别的因子,而在我的原始数据帧中则不是这样。
答案 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