R中大于0时,如何选择列名称及其值?
我有一个xts对象,它包含多个列,每行有一个数值,我需要选择n-1天值大于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
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