我找不到针对自己特定问题的解决方案,因此在此发布。我有根据每日计算而变化的数据框。但是本质上我想做的是,如果该值包含零,则删除最后一行,并在所有三个变量(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),])
我需要代码查看最后一行并将其删除,直到满足不包含零的条件为止。
任何帮助将不胜感激!
答案 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