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
我已经尝试使用 apply
和 which(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
我有一个 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
我已经尝试使用 apply
和 which(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