3

我正在尝试确定下一个 x(6 是当前计划,但这可能会发生变化)余额每月保持不变还是减少。

我在 Excel 中执行此操作,以便它从当前月份的值开始,并将下个月的值与它进行比较,看看它是保持不变还是减少等等。

=IF(AND(H3<=H2,H4<=H3,H5<=H4,H6<=H5,H7<=H6,H8<=H7),1,0)

这不是最灵活或最优雅的公式,因为它是最初探索的一部分。为了让一切更清晰、更可重复,我想把我的计算放到 R 中。

这是一个基本数据集,就像我的多个 ID 数月的数据一样。

rbind(data.frame(ID=1,Month=1:11,Bal=seq(from=500, to=300, by=-20)),
  data.frame(ID=2,Month=1:10,Bal=rep(200,10)),
  data.frame(ID=3,Month=1:11,Bal=seq(from=300, to=500, by=20)))

在行级别上根据原始数据计算或在 ddply 内工作的东西是理想的解决方案变体。

我对 R 还是很陌生,我确信有一个优雅的解决方案,但我真的看不到它。任何人都有一个简洁的解决方案,或者可以指出我应该研究的各种关键术语的方向,以尝试找到解决方案?

4

2 回答 2

3

我不确定我是否理解正确:

checkfun <- function(x,n) {
   rev(filter(rev(c(diff(x) <= 0,NA)),rep(1,n),sides=1)) == n
}

此函数计算连续值之间的差异并检查它们是否 <= 0。过滤器将满足条件的后续 n 个差异的数量相加。最后将这个数与 n 进行比较,看是否都满足条件。(rev仅使用,以便可以使用单面过滤器。)

DF$Bal[6] <- 505 #to not only have equal differences
library(plyr)
#example with 3 next values
ddply(DF,.(ID),transform,check=checkfun(Bal,3))
#    ID Month Bal check
# 1   1     1 500  TRUE
# 2   1     2 480  TRUE
# 3   1     3 460 FALSE
# 4   1     4 440 FALSE
# 5   1     5 420 FALSE
# 6   1     6 505  TRUE
# 7   1     7 380  TRUE
# 8   1     8 360  TRUE
# 9   1     9 340    NA
# 10  1    10 320    NA
# 11  1    11 300    NA
# 12  2     1 200  TRUE
# 13  2     2 200  TRUE
# 14  2     3 200  TRUE
# 15  2     4 200  TRUE
# 16  2     5 200  TRUE
# 17  2     6 200  TRUE
# 18  2     7 200  TRUE
# 19  2     8 200    NA
# 20  2     9 200    NA
# 21  2    10 200    NA
# 22  3     1 300 FALSE
# 23  3     2 320 FALSE
# 24  3     3 340 FALSE
# 25  3     4 360 FALSE
# 26  3     5 380 FALSE
# 27  3     6 400 FALSE
# 28  3     7 420 FALSE
# 29  3     8 440 FALSE
# 30  3     9 460    NA
# 31  3    10 480    NA
# 32  3    11 500    NA
于 2013-07-03T16:39:45.640 回答
2

如果df是你的data.frame:

您可以使用以下方法找到连续的差异:

df$diff <- do.call("c",lapply(unique(df$ID), function(x) c(0,diff(df$Bal[df$ID==x]))))

这假设您希望为不同的 ID 分开计算。

> head(df)
  ID Month Bal diff
1  1     1 500    0
2  1     2 480  -20
3  1     3 460  -20
4  1     4 440  -20
5  1     5 420  -20
6  1     6 400  -20

现在,对于一个给予k=6(比如说),检查:

sapply(unique(df$ID), function(x) ifelse(sum(df$diff[df$ID==x][1:k] < 0)!=0,1,0)) 
[1] 1 0 0

它为每个 ID 返回值 1(所有差异均为负)或 0(所有差异均为正)。

于 2013-07-03T16:32:11.507 回答