增加嵌套在 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
在 diff
与 NA
合作时,您从 NA
撤回的任何内容都会得到 NA
:
> diff(c(1,3,4,NA,5,7))
[1] 2 1 NA NA 2
我正在尝试使用 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
在 diff
与 NA
合作时,您从 NA
撤回的任何内容都会得到 NA
:
> diff(c(1,3,4,NA,5,7))
[1] 2 1 NA NA 2