R:获取上一组中的最后一个条目

时间:2015-10-15 11:47:18

标签: r dplyr

我有这样的数据:

Group Year Month Mean_Price
  A    2013  6      200
  A    2013  6      200
  A    2014  2      100  
  A    2014  2      100
  B    2014  1      130  

我想添加另一个列,它从上面的组中获取最后一个条目,如下所示:

Group Year Month Mean_Price  Last_Mean_price
  A    2013  6      200           x
  A    2013  6      200           x
  A    2014  2      100         200 
  A    2014  2      100         200  ---This is where I am facing problem as doing dplyr + lag is just getting the last row entry and not the entry of th *last group's* last row.
  B    2014  1      130           x
  B    2014  4      140         130

所有帮助将不胜感激。谢谢!

我在这里问了一个相关的问题:Get the (t-1) data within groups 但后来我没有按年和月分组

1 个答案:

答案 0 :(得分:0)

这可能是一种方法。我不确定您希望如何对数据进行分组。在这里,我选择使用GROUPYearMonth对您的数据进行分组。首先,我想创建一个包含每个组中所有最后元素的向量,即foo

group_by(mydf, Group, Year, Month) %>%
summarize(whatever = last(Mean_Price)) %>%
ungroup %>%
select(whatever) %>%
unlist -> foo

# whatever1 whatever2 whatever3 whatever4 
# 200       100       130       140

其次,我为后来的流程安排了foo。基本上,我在第一个位置添加了x并删除了foo中的最后一个元素。

### Arrange a vector 
foo <- c("x", foo[-length(foo)])

第三,我使用mydfmutate()中的每个群组添加了行号。然后,我用x放宽了所有数字,但是1。

group_by(mydf, Group, Year, Month) %>%
mutate(ind = row_number(),
       ind = replace(ind, which(row_number(ind) != 1), "x")) -> temp

最后,我确定了ind中有1的行,并为行指定了foo

temp$ind[temp$ind == 1] <- foo
temp

#   Group  Year Month Mean_Price   ind
#  (fctr) (int) (int)      (int) (chr)
#1      A  2013     6        200     x
#2      A  2013     6        200     x
#3      A  2014     2        100   200
#4      A  2014     2        100     x
#5      B  2014     1        130   100
#6      B  2014     4        140   130

数据

mydf <- structure(list(Group = structure(c(1L, 1L, 1L, 1L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), Year = c(2013L, 2013L, 2014L, 2014L, 
2014L, 2014L), Month = c(6L, 6L, 2L, 2L, 1L, 4L), Mean_Price = c(200L, 
200L, 100L, 100L, 130L, 140L)), .Names = c("Group", "Year", "Month", 
"Mean_Price"), class = "data.frame", row.names = c(NA, -6L))