【发布时间】:2018-08-13 17:46:25
【问题描述】:
我想调整 val 列,这样就不会有任何负值了。
调整规则是,
- 用前一行的一半替换负值
- 为每个层执行此操作 ( group_by(hier) )
-
如果连续出现多个负值,则将前一个调整后的值除以2
xdat <- data.frame( hier = c(rep("A",5), rep("B",5) ) , val = c(4, 7, -3, 10, 5, 1, -7, -4, 5, 7) ) hier | val | val_adjust A | 4 | 4 A | 7 | 7 A | -3 | 3.5 A | 10 | 10 A | 5 | 5 B | 1 | 1 B | -7 | 0.5 B | -4 | 0.25 B | 5 | 5 B | 7 | 7
【问题讨论】:
-
如果层级中的第一个值为负数怎么办?
-
在我的情况下不会,但我的建议是写下最低值的一半
-
xdat$val2 <- ave(xdat$val, xdat$hier, FUN = function(x) {while (any(x < 0)) x[x < 0] <- c(0, head(x, -1) / 2)[x < 0]; x})