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

R中大于0时,如何选择列名称及其值?,r,xts,R,Xts,我有一个xts对象,它包含多个列,每行有一个数值,我需要选择n-1天值大于0的列的名称和值 Object1 <- colnames(xxx)[apply(xxx[Sys.Date()-1],1,which.max)] 我想为第n-1天重设如下对象: >Object HHHHHH IIIIII NNNNNN 2015-03-03 0.33 0.33 0.33 或者,如果它可以是每行一行,那就更好了: >Object 2015-03

我有一个xts对象,它包含多个列,每行有一个数值,我需要选择n-1天值大于0的列的名称和值

Object1 <- colnames(xxx)[apply(xxx[Sys.Date()-1],1,which.max)]
我想为第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
,但不幸的是,它为每列返回TRUE或FALSE

谢谢你

你可以试试

res <- t(apply(xxx[Sys.Date()-1], 1, function(x) x[x==max(x)]))
更新 你也可以这样做

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

@Florent没问题。出于某种原因,很高兴能帮助您,当只有一列的值大于0(即值等于1)时,
res
没有列的名称,而是
[1,]
。我不熟悉R中的函数,尝试使用
x[x>0]
x[x==max(x)| x==1]
但没有成功。更清楚地说,
res至少有两列的值大于0时,它会工作。如果只有一列(值等于1),然后它得到值,但不是列的名称。@Florent I更新了解决方案。基于
apply
MARGIN=1
的解决方案主要用于多行。在这里,根据所用代码,您只处理一行。在这种情况下,即使只有一列满足要求,更新后的解决方案也会工作情况如何
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
 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