对于第一行项目,我可以放置一些文本或空白 (例如'skip'或空白是好的)因为没有前一行的比较 项目
df <- data.frame(period=rep(1:4,2),
farm=c(rep('A',4),rep('B',4)),
cumVol=c(1,5,15,31,10,12,16,24), item=c(rep('Z',3),rep('Y',3),rep('X',2)),
other = 1:8);
我希望得出的&#39; Percentage_Change&#39;列(数据集的附加列)如下所示。 (公式:100 /上一项行值*当前行项目值...第二行示例..100 / 1 * 5 = 500)
Row Percentage_Change
1 Skip
2 500
3 300
4 Skip
5 32.25806452
6 120
7 Skip
8 150
感谢您的帮助。
答案 0 :(得分:3)
dplyr
可以做同样的事情。这完全类似于akrun的答案,但使用其他语法。
library(dplyr)
mutate(df, Row = 1:n()) %>%
group_by(item) %>%
mutate(Percentage_Change = cumVol/lag(cumVol) * 100) %>%
ungroup %>%
select(Row, Percentage_Change)
## Source: local data frame [8 x 2]
##
## Row Percentage_Change
## (int) (dbl)
## 1 1 NA
## 2 2 500.00000
## 3 3 300.00000
## 4 4 NA
## 5 5 32.25806
## 6 6 120.00000
## 7 7 NA
## 8 8 150.00000
答案 1 :(得分:2)
我们可以使用shift
中的data.table
。将'data.frame'转换为'data.table'(setDt(df)
),按'item'分组,我们从.I
获取“Row”并通过除以“cumVol”创建“Percentage_Change” “由lag
的”cumVol“(由shift
得到)并乘以100.如果需要,可以通过将(:=
)赋值为NULL来删除分组列。
library(data.table)
setDT(df)[, list(Row = .I, Percentage_Change=round(cumVol*
(100/shift(cumVol)),2)), .(item)][, item := list(NULL)][]
# Row Percentage_Change
#1: 1 NA
#2: 2 500.00
#3: 3 300.00
#4: 4 NA
#5: 5 32.26
#6: 6 120.00
#7: 7 NA
#8: 8 150.00
注意:这为没有比较的元素提供NA,而不是Skip
。