如何创建一个新列,其公式取决于另一行的单元格值
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 = current_x_val的z值,y = current_y_val-1 0(如果不可用)。
我如何实现这一目标。
到目前为止我的进展:
data[data$x == "a" & data$y==2-1,3]
我手动输入值并获得每行的prevY。但是如何在一次拍摄中对所有行进行此操作?
答案 0 :(得分:2)
在这里,您可以使用ave()
函数进行组级转换(此处,x的每个值都有不同的转换)。
dd$prevY <- with(dd, ave(z, x, FUN=function(x) head(c(0,x),-1)))
这里我们为x的每个值取z的值,并在前面添加一个零并删除最后一个值。然后我们将其分配回data.frame。
这假设所有y
值都在每个x
组中排序。
结果是
x y z prevY
1 a 1 10 0
2 a 2 20 10
3 a 3 30 20
4 b 1 40 0
答案 1 :(得分:2)
或data.table
解决方案(类似于MrFlick)但对于大数据集更快
library(data.table)
setDT(dat)[, prevY := c(0, z[-length(z)]), by = x]