迭代删除行,直到满足条件

时间:2020-06-17 01:05:24

标签: r

我找不到针对自己特定问题的解决方案,因此在此发布。我有根据每日计算而变化的数据框。但是本质上我想做的是,如果该值包含零,则删除最后一行,并在所有三个变量(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),])

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

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

您可以找出所有列中所有值都不为零的行索引,并选择所有行,直到其值为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))

答案 1 :(得分:2)

另一种解决方案

df %>% 
  filter_all(all_vars(. != 0))

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

答案 2 :(得分:1)

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

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