【问题标题】:deleting rows iteratively until condition is met迭代删除行直到满足条件
【发布时间】:2020-10-06 17:37:42
【问题描述】:

我找不到特定问题的解决方案,所以我在这里发帖。我有根据每日计算更改的数据框。但基本上我想要做的是如果值包含零则删除最后一行,并在所有三个变量(A、B、C)都有值时停止。例如:

DF

A  B C
4  3 7
3  3 4
7  0 4
4  7 0

预期输出

DF

A  B  C
4  3  7
3  3  4

所以在这种情况下,我想删除最后两行,因为 B 和 C 中有零。但情况并非总是如此。有时只有最后一行需要删除,有时是最后三行。基本上我正在寻找这样的东西:

df<-last(df[!(d$B=0 | df$C=0),])

我需要代码查看最后一行并将其删除,直到满足不包含任何零的条件。

任何帮助将不胜感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    另一种解决方案

    df %>% 
      filter_all(all_vars(. != 0))
    
    df %>% 
      filter(across(everything(), .fns = function(x) x != 0))
    

    【讨论】:

      【解决方案2】:

      dplyr/tidyr 选项可能更直观。用 NA 替换零,然后删除所有至少有一个 NA 的行:

      library(tidyverse)
      df %>% 
        na_if(0) %>% 
        drop_na()
      
        A B C
      1 4 3 7
      2 3 3 4
      

      【讨论】:

      • 谢谢大家!所有可行的答案
      【解决方案3】:

      您可以找出所有列中所有值都非零的行索引,并选择所有行直到它的max 值。

      df[seq_len(max(which(rowSums(df == 0) == 0))),]
      #This is same as
      #df[1:max(which(rowSums(df == 0) == 0)),]
      
      #  A B C
      #1 4 3 7
      #2 3 3 4
      

      数据

      df <- structure(list(A = c(4L, 3L, 7L, 4L), B = c(3L, 3L, 0L, 7L), 
      C = c(7L, 4L, 4L, 0L)), class = "data.frame", row.names = c(NA, -4L))
      

      【讨论】:

      • 太棒了。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多