我有这样的数据:
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 但后来我没有按年和月分组
答案 0 :(得分:0)
这可能是一种方法。我不确定您希望如何对数据进行分组。在这里,我选择使用GROUP
,Year
和Month
对您的数据进行分组。首先,我想创建一个包含每个组中所有最后元素的向量,即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)])
第三,我使用mydf
为mutate()
中的每个群组添加了行号。然后,我用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))