增加嵌套在 R 中另一列中的一个变量 + 将 0 设置为起始值

increase in one variable nested within another column in R + setting 0 as starting value

我正在尝试使用 diff 函数来计算此数据集 (df) 中变量 ("damage") 的增量。我想用这个新变量填充 "damage_new" 列。你现在看到的价值观就是我想要拥有的价值观。

df = data.frame(id=c(1,1,1,2,2), trial=c(1,3,4,1,2), damage=(1,NA,3,1,5))

df

  ID  TRIAL DAMAGE DAMAGE_NEW  
  1      1    1      0  
  1      3    NA    NA  
  1      4    3     NA  
  2      1    1     0  
  2      2    5     4   

如果我运行
diff(df$damage) 它将计算整个数据集的差异。

有两件事我没有做到:
- 如何将差异嵌套在另一列的值中?具体来说,我想计算伤害增加(针对整个数据集),但在我重复测量的单个个体 (ID) 内。 -我还希望 damage_new 列与数据集的其余部分长度相同(附加它),并且对于每个人,将 damage_new 的第一个值设置为 0,因为显然第一次测量没有参考。
-为了进一步描述数据集,我在“损坏”列中有 NA,我怀疑这会导致 damage_new 列中有更多 NA,但我想保留它们(我想知道该函数如何处理他们?)。我也没有相同数量的每个人的测量(他们会有不同数量的试验,中间有一些缺失)。

非常感谢您始终快速高效的回答!

dplyr 包非常适合这种事情:

library(dplyr)
df %>% group_by(id) %>% mutate(damage_new=c(0,diff(damage)))
Source: local data frame [5 x 4]
Groups: id

  id trial damage damage_new
1  1     1      1          0
2  1     3     NA         NA
3  1     4      3         NA
4  2     1      1          0
5  2     2      5          4

您可以阅读更多关于 dplyr 用法的信息 here

更新

如果您想使用基础 R,您可以这样做:

df$damage_new <- ave(df$damage,df$id,FUN=function(v) c(0,diff(v)))

这将产生相同的 df

图书馆 data.table 是你的朋友:

> library(data.table)
> setDT(df)
> setkey(df, id, trial)
> df[,new_damage:=c(0,diff(damage)),by=id]
> df
   id trial damage new_damage
1:  1     1      1          0
2:  1     3     NA         NA
3:  1     4      3         NA
4:  2     1      1          0
5:  2     2      5          4

diffNA 合作时,您从 NA 撤回的任何内容都会得到 NA:

> diff(c(1,3,4,NA,5,7))
[1]  2  1 NA NA  2