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以上的列数,如果可能的话,我也应该得到列名。
答案 0 :(得分: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:如果你使用rownames(全部),你也可以获得日期。
table(rownames(all))
split(all, rownames(all))
EDIT3:显然我很想念这个问题。名称的问题来自apply
函数。如果您改用lapply
,则会获得所需的rownames。然后,您可以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有一个align-argument。你显然想要右对齐(默认是中心)。
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
属于xts
类,则它没有rownames,因此矩阵all
也没有。您可以使用as.matrix(sra)
再次获取rownames。我添加的最后一行是为了防止您想知道列的名称而不是数字。
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]