R 创建一个新列,其公式取决于另一行的单元格值

R 创建一个新列,其公式取决于另一行的单元格值,r,R,如何创建其公式依赖于另一行的单元格值的新列 x y z 1 a 1 10 2 a 2 20 3 a 3 30 4 b 1 40 这是我的样本数据。我希望最终输出如下 x y z prevY 1 a 1 10 0 2 a 2 20 10 3 a 3 30 20 4 b 1 40 0 其中,prevY是x=当前值,y=当前值-1 0(如果不可用)的z值 我如何做到这一点 我目前的进展: data[data$x == "a" & data$y==2-1,3] 我手动输入值并获

如何创建其公式依赖于另一行的单元格值的新列

  x y  z
1 a 1 10
2 a 2 20
3 a 3 30
4 b 1 40
这是我的样本数据。我希望最终输出如下

  x y  z prevY
1 a 1 10 0
2 a 2 20 10
3 a 3 30 20
4 b 1 40 0
其中,prevY是x=当前值,y=当前值-1 0(如果不可用)的z值

我如何做到这一点

我目前的进展:

data[data$x == "a" & data$y==2-1,3]

我手动输入值并获取每行的上一个值。但是如何在一次快照中对所有行执行此操作?

在这里,您可以使用
ave()
函数进行组级转换(在这里,对每个x值进行不同的转换)


在这里,您可以使用
ave()
函数进行组级转换(这里,每个x值的转换不同)


或者
data.table
解决方案(类似于MrFlick),但对于大数据集来说速度更快

library(data.table)
setDT(dat)[, prevY := c(0, z[-length(z)]), by = x]

或者
data.table
解决方案(类似于MrFlick),但对于大数据集来说速度更快

library(data.table)
setDT(dat)[, prevY := c(0, z[-length(z)]), by = x]

是的,就是这样,尽管我更喜欢:
c(0,head(x,-1))
在函数中。使用with的原因是什么?ave(z,x,FUN=function(x)c(0,x[-length(x)])似乎为我得到了结果。@user2070649您是否偶然附加了data.frame?我只是假设x,y和z只存在于data.frame中,我在这里称之为
dd
。如果将它们作为全局变量,则不需要使用带有@thelatemail的
,我总是在这两个语法上来回移动。但我认为在这种情况下,您的建议更简洁,所以我对其进行了更改。是的,尽管我更喜欢函数中的
c(0,head(x,-1))
。使用with的原因是什么?ave(z,x,FUN=function(x)c(0,x[-length(x)])似乎为我得到了结果。@user2070649您是否偶然附加了data.frame?我只是假设x,y和z只存在于data.frame中,我在这里称之为
dd
。如果将它们作为全局变量,则不需要使用带有
@thelatemail的
,我总是在这两个语法上来回移动。但我认为在这种情况下,你的建议更干净,所以我改变了它。
library(data.table)
setDT(dat)[, prevY := c(0, z[-length(z)]), by = x]