如何在R中大于0时选择列名及其值?

时间:2015-03-04 11:50:06

标签: r xts

我有一个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

我尝试使用applywhich(xxx[Sys.Date()-1]>0但不幸的是,每列都返回FUE的TRUE。

谢谢

1 个答案:

答案 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