两个事件之间的百分比差异

Ame*_*mer 3 r dplyr

我有一个如下所示的数据框:

df1 <- 

ID event  CONC
1   1      5
1   2      10
3   1      7
3   2      10
Run Code Online (Sandbox Code Playgroud)

对于每一行,我想计算两个事件之间的百分比差异,并将其添加到新列中.

例如:对于ID = 1

diff <- (10-5)*100
Run Code Online (Sandbox Code Playgroud)

我需要有关如何为每个行指定(CONCrow2-CONCrow1)的帮助.然后我可以使用以下内容通过ID应用它:

df2 <- df1 %>%
 group_by(ID) %>%
 mutate (percent = ....)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

你可以试试

library(dplyr)
df1 %>% 
    group_by(ID) %>% 
    mutate(percent=100*(CONC-lag(CONC)))
Run Code Online (Sandbox Code Playgroud)

或使用 base R

transform(df1, percent=ave(CONC, ID, FUN=function(x) 100*c(NA, diff(x))))
Run Code Online (Sandbox Code Playgroud)

或使用 data.table

library(data.table)
setDT(df1)[, percent := 100*c(NA, diff(CONC)), ID]
Run Code Online (Sandbox Code Playgroud)

更新

基于@Jan Gorecki的评论,shift是一个新的选项 data.table_1.9.5(开发版)

 setDT(df1)[,percent := 100*(CONC - shift(CONC)), by=ID][]
Run Code Online (Sandbox Code Playgroud)