R中大于0时如何select列名及其值?

How to select columns name and its value when greater than 0 in R?

我有一个 xts 对象,其中包含多列,每行一个数值,我需要 select 第 n-1 天值大于 0 的列的名称和值。

Object1 <- colnames(xxx)[apply(xxx[Sys.Date()-1],1,which.max)]

我用它来 select 值 > 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

我已经尝试使用 applywhich(xxx[Sys.Date()-1]>0,但不幸的是,每一列都是 returns TRUE 或 FALSE。

谢谢

你可以试试

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