1
library("xts")
data1<- cbind(a = c(1,2,3,4,5,6,5,4,3,4,5,6,5,4,3,5),
              b = c(1,2,3,4,5,6,5,4,3,4,5,6,5,4,3,5),
              c = c(1,2,3,4,5,6,5,4,5,4,5,4,5,4,5,2),
              d = c(1,2,3,4,5,6,5,4,1,1,1,1,1,2,3,2))
data<- xts(data1, Sys.Date() - (16:1))

data

           a b c d
2013-07-09 1 1 1 1
2013-07-10 2 2 2 2
2013-07-11 3 3 3 3
2013-07-12 4 4 4 4
2013-07-13 5 5 5 5
2013-07-14 6 6 6 6
2013-07-15 5 5 5 5
2013-07-16 4 4 4 4
2013-07-17 5 3 5 1
2013-07-18 4 4 4 1
2013-07-19 5 5 5 1
2013-07-20 4 6 4 1
2013-07-21 5 5 5 1
2013-07-22 4 4 4 2
2013-07-23 3 3 5 3
2013-07-24 5 5 2 2

我有一个包含 100 个这样的列的数据集。我需要一种方法或定义一个函数,它可以告诉我有多少这样的列,比如在某一天的 5 天 SMA(移动平均线)之上。如果我给出一个特定的日期和 5 天的 SMA,我应该得到高于该 SMA 的列数,如果可能的话,还有列名。

4

1 回答 1

2

您可以使用which然后制表、订购等。

all <- which(data>5, arr.ind=TRUE)
table(all[,"row"])
all[order(all[,"row"]),]
split(all, all[,"row"])

编辑:对于滚动平均值,您可以先计算滚动平均值,然后如上所述进行。

sra <- apply(data, 2, rollmean, k=5)
all <- which(sra>5, arr.ind=TRUE)

EDIT2:如果您使用行名(全部),您还可以获得日期。

table(rownames(all))
split(all, rownames(all))

EDIT3:显然我误解了这个问题。名称的问题来自apply功能。如果您lapply改用,您将获得所需的行名。然后,您可以cbind使用数据来获取第一天和最后两天的 NA。

sra <- do.call(cbind, lapply(data, rollmean, k=5))
sra <- cbind(sra, data)[, 1:ncol(sra)]
all <- which(sra>data, arr.ind=TRUE)
all

EDIT4:请注意,rollmean 有一个对齐参数。您显然想要右对齐(默认为中心)。

sra <- do.call(cbind, lapply(data, rollmean, k=5, align="right"))
sra <- cbind(sra, data)[, 1:ncol(sra)]
all <- which(sra>data, arr.ind=TRUE)
all

编辑 5:如果sra是 class xts,它没有行名,因此矩阵all也没有。您可以as.matrix(sra)再次使用来获取行名。我添加的最后一行是为了以防您想知道列的名称而不是数字。

sra <- do.call(cbind, lapply(data, rollmean, k=5, align="right"))
sra <- as.matrix(cbind(sra, data)[, 1:ncol(sra)])
all <- which(sra>data, arr.ind=TRUE)
table(rownames(all))
split(all[,"col"], rownames(all))
lapply(split(all[,"col"], rownames(all)), function(x) colnames(data)[x])

编辑 6:要查看某个特定日期,请保存最终列表并指定日期,然后从列表中提取日期。例如:

lst <- lapply(split(all[,"col"], rownames(all)), function(x) colnames(data)[x])
dat <- "2013-07-23"
lst[dat]
于 2013-07-25T11:13:57.377 回答