在R+中嵌套在另一列中的一个变量的增加;将0设置为起始值
我试图使用diff函数来计算这个数据集(df)中变量(“损害”)的增加。我想用这个新变量填充“damage_new”列。您现在看到的值就是我想要的值在R+中嵌套在另一列中的一个变量的增加;将0设置为起始值,r,nested,diff,R,Nested,Diff,我试图使用diff函数来计算这个数据集(df)中变量(“损害”)的增加。我想用这个新变量填充“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 如果我跑 diff(df$damage)它将计算整个数据集中的差异 有两件事我没有做到: -如何将差异嵌套在另一列的值中?具体地说,我想计算(整个数据集的)损伤增加,但是在单个个体(ID)内,我
df = data.frame(id=c(1,1,1,2,2), trial=c(1,3,4,1,2), damage=(1,NA,3,1,5))
df
如果我跑diff(df$damage)
它将计算整个数据集中的差异
有两件事我没有做到:-如何将差异嵌套在另一列的值中?具体地说,我想计算(整个数据集的)损伤增加,但是在单个个体(ID)内,我重复测量了其中的一个。 -我还希望damage_new列的长度与数据集的其余部分相同(以附加它),并且对于每个个体,将damage_new的第一个值设置为0,因为第一个测量值显然没有参考值。
-为了进一步描述数据集,我在“损坏”列中有NAs,我怀疑这会导致“损坏”新列中有更多NAs,但我想保留它们(我想知道函数如何处理它们?)。我也没有每个人相同数量的测量值(他们将进行不同数量的试验,中间有些缺失)
非常感谢您总是快速高效的回答!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用法的更多信息
更新
如果您想使用base R,可以执行以下操作:
df$damage_new <- ave(df$damage,df$id,FUN=function(v) c(0,diff(v)))
df$damage\u newdplyrpackage非常适合这类物品:
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用法的更多信息
更新
如果您想使用base R,可以执行以下操作:
df$damage_new <- ave(df$damage,df$id,FUN=function(v) c(0,diff(v)))
df$damage\u newLibrarydata.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
库数据。表是您的朋友吗:
> 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
出于好奇:在这个例子中,为什么需要设置密钥?小技巧:设置密钥设置密钥…但也要先按id排序,然后按试验排序!我不认为data.frame已经排序,在未排序的data.frame上使用diff没有意义-就像在两个非连续试验上一样;)谢谢!我运行了代码from@MaratTalipov在R base中,它成功了!我已经按照ID对数据帧进行了排序,然后进行了试验,以便按照正确的顺序计算损伤增加。感谢@Colonel Beauvel解释diff如何处理NAs。如果只是为了订购,您可以使用setorder
。只需使用c即可uriosity:为什么在这个例子中需要设置关键点?小技巧:setkey设置关键点…但也要先按id排序,然后按试用顺序排序!我不认为data.frame已经排序,在未排序的data.frame上使用diff没有意义,就像在两个非连续的试用中一样;)谢谢!我运行了代码from@MaratTalipov在R基地和它的工作ked!我已经按ID对数据帧进行了排序,然后按试验对数据帧进行了排序,以便按照正确的顺序计算损伤增加量。感谢@Colonel Beauvel解释diff如何处理NAs。如果只是为了订购,您可以使用setorder
。