Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R+中嵌套在另一列中的一个变量的增加;将0设置为起始值_R_Nested_Diff - Fatal编程技术网

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

在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)内,我

我试图使用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)内,我重复测量了其中的一个。 -我还希望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 newdplyr
package非常适合这类物品:

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 newLibrary
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

数据。表
是您的朋友吗:

> 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