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

时间:2015-01-29 15:46:18

标签: r nested diff

我试图使用diff函数来计算此数据集(df)中变量的增加("损坏")。我想填写专栏#34; 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,因为很明显第一个测量没有参考。
- 为了进一步描述数据集,我在“伤害”中有NAs。列,我怀疑会在damage_new列中导致更多的NA,但我想保留它们(我想知道函数如何处理它们?)。我也不会对每个人进行相同数量的测量(他们将有不同数量的试验,其间有一些缺失)。

非常感谢您提供快速有效的答案!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

图书馆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

在使用diff的{​​{1}}上,您从NA退出的任何内容都会NA

NA