我试图使用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,但我想保留它们(我想知道函数如何处理它们?)。我也不会对每个人进行相同数量的测量(他们将有不同数量的试验,其间有一些缺失)。
非常感谢您提供快速有效的答案!
答案 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