【问题标题】:Delete rows from zoo-object based on conditions根据条件从动物园对象中删除行
【发布时间】:2015-04-10 07:42:40
【问题描述】:

我合并了 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 并在重新导入时处理行。 有谁愿意分享更优雅的方式吗?

最好的问候 乔辰

【问题讨论】:

    标签: r zoo


    【解决方案1】:

    您可以使用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
    

    或者如 cmets 中提到的@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")
    

    【讨论】:

    • 这些也有效:z1[apply(z1 != 0, 1, all), ]z1[apply(!!z1, 1, all), ]z1[!apply(z1 == 0, 1, any), ]
    • @G.Grothendieck 你应该把它们写成答案
    • 这些似乎与当前答案没有足够的不同,因此需要一个全新的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2023-03-27
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多