我有一个xts对象,其中包含多行,每行有一个数值,我需要选择n-1日值大于0的列的名称和值。
Object1 <- colnames(xxx)[apply(xxx[Sys.Date()-1],1,which.max)]
我用它来选择值为&gt;的行的列名称。 0但只有当有一列时它才有效。我的xts对象可以有几个。
请查看xts对象xxx
的外观:
AAAAAA BBBBBB CCCCCC DDDDDD EEEEEE FFFFFF GGGGGG HHHHHH IIIIII JJJJJJ KKKKKK LLLLLL MMMMMM NNNNNN OOOOOO PPPPPP
2015-02-25 0 0 0.00 0 0 0 0 0.33 0.00 0 0 0 0 0.33 0.33 0
2015-02-26 0 0 0.33 0 0 0 0 0.33 0.00 0 0 0 0 0.33 0.00 0
2015-02-27 0 0 0.33 0 0 0 0 0.33 0.00 0 0 0 0 0.33 0.00 0
2015-03-02 0 0 0.00 0 0 0 0 0.33 0.33 0 0 0 0 0.33 0.00 0
2015-03-03 0 0 0.00 0 0 0 0 0.33 0.33 0 0 0 0 0.33 0.00 0
2015-03-04 0 0 0.00 0 0 0 0 0.33 0.33 0 0 0 0 0.33 0.00 0
我想在第n-1天撤回这样一个对象:
>Object
HHHHHH IIIIII NNNNNN
2015-03-03 0.33 0.33 0.33
或者如果它可以是每行一行会更好:
>Object
2015-03-03 HHHHHH 0.33
2015-03-03 IIIIII 0.33
2015-03-03 NNNNNN 0.33
我尝试使用apply
和which(xxx[Sys.Date()-1]>0
但不幸的是,每列都返回FUE的TRUE。
谢谢
答案 0 :(得分:1)
你可以尝试
res <- t(apply(xxx[Sys.Date()-1], 1, function(x) x[x==max(x)]))
获取第二种格式
library(reshape2)
melt(res)
# Var1 Var2 value
#1 2015-03-03 HHHHHH 0.33
#2 2015-03-03 IIIIII 0.33
#3 2015-03-03 NNNNNN 0.33
您也可以
indx <- xxx[Sys.Date()-1]==max(xxx[Sys.Date()-1])
xxx[Sys.Date()-1][,indx]
# HHHHHH IIIIII NNNNNN
#2015-03-03 0.33 0.33 0.33
melt(as.matrix( xxx[Sys.Date()-1][,indx]))
# Var1 Var2 value
#1 2015-03-03 HHHHHH 0.33
#2 2015-03-03 IIIIII 0.33
#3 2015-03-03 NNNNNN 0.33
对于一栏案例
xxx[Sys.Date()-1, 8:9] <- 0
indx <- xxx[Sys.Date()-1]==max(xxx[Sys.Date()-1])
xxx[Sys.Date()-1][,indx]
# NNNNNN
#2015-03-03 0.33
或者使用apply
的选项是
res <- do.call(rbind,apply(xxx[Sys.Date()-1], 1,
function(x) as.list(x[x==max(x)])))
res
# NNNNNN
#2015-03-03 0.33
melt(res)
# Var1 Var2 value
#2015-03-03 2015-03-03 NNNNNN 0.33