根据条件从zoo-object中删除行

时间:2015-04-10 07:42:40

标签: r zoo

我合并了2个不同的(不规则的)时间序列( 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

我没有为动物园对象找到合适的方法,所以我使用非常不雅的方式将数据导出到* .csv并在重新导入时处理行。 谁愿意分享更优雅的方式?

祝你好运 Jochen

1 个答案:

答案 0 :(得分:2)

您可以使用subset[

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循环遍历行,并使用allany获取逻辑索引。在这里,!表示否定。 !!双重否定(z1!=0!!z1相同)。

 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")