R 根据条件从zoo对象中删除行

R 根据条件从zoo对象中删除行,r,zoo,R,Zoo,我合并了两个不同的(不规则的)时间序列(merge.zoo()。看起来像: quir schme 2006-01-01 01:15:00 725.24 4.64 2006-01-01 01:30:00 725.24 4.64 2006-01-01 01:45:00 0 4.64 2006-01-01 02:00:00 725.24 4.64 我要删除显示0个值的所有行,以接收: q

我合并了两个不同的(不规则的)时间序列(merge.zoo()。看起来像:

                     quir   schme 
2006-01-01 01:15:00 725.24   4.64
2006-01-01 01:30:00 725.24   4.64
2006-01-01 01:45:00      0   4.64
2006-01-01 02:00:00 725.24   4.64
我要删除显示0个值的所有行,以接收:

                    quir   schme 
2006-01-01 01:15:00 725.24   4.64
2006-01-01 01:30:00 725.24   4.64
2006-01-01 02:00:00 725.24   4.64
对于zoo对象,我没有找到合适的方法来实现这一点,因此我使用了非常不公平的方法将数据导出到*.csv,并在重新导入时处理行。 谁愿意以更优雅的方式分享

致意
Jochen

您可以使用
子集
[

library(zoo) 
subset(z1, quir!=0)
#                      quir schme
#2006-01-01 01:15:00 725.24  4.64
#2006-01-01 01:30:00 725.24  4.64
#2006-01-01 02:00:00 725.24  4.64
如果任何列中存在
0
值,则需要删除行

z1[!rowSums(z1==0),]
#                      quir schme
#2006-01-01 01:15:00 725.24  4.64
#2006-01-01 01:30:00 725.24  4.64
#2006-01-01 02:00:00 725.24  4.64
或者,正如@G.Grothendieck在评论中提到的,我们可以使用
apply
循环行,并使用
all
any
获得逻辑索引。这里,
表示否定。
!!
双重否定(
z1!=0
.z1
相同)

数据
z1这些同样有效:
z1[apply(z1!=0,1,all),]
z1[apply(!!z1,1,all),]
z1[!apply(z1==0,1,any),]
@G.Grothendieck你应该把它们作为答案写出来。这些答案似乎与当前的答案没有太大的不同,不能保证有一个全新的答案。
 z1[apply(z1 != 0, 1, all), ]
 z1[apply(!!z1, 1, all), ]
 z1[!apply(z1 == 0, 1, any), ]
z1 <- structure(c(725.24, 725.24, 0, 725.24, 4.64, 4.64, 4.64, 4.64
), .Dim = c(4L, 2L), .Dimnames = list(NULL, c("quir", "schme"
)), index = structure(c(1136096100, 1136097000, 1136097900, 1136098800
), class = c("POSIXct", "POSIXt"), tzone = ""), class = "zoo")