итеративное удаление строк до тех пор, пока не будет выполнено условие - PullRequest
1 голос
/ 17 июня 2020

Я не смог найти решение моего конкретного c вопроса, поэтому пишу здесь. У меня есть данные, которые меняются в зависимости от ежедневных расчетов. Но, по сути, я хочу удалить последние строки, если значение содержит ноль, и остановиться, когда все три переменные (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 ]

2 голосов
/ 17 июня 2020

Другое решение

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

df %>% 
  filter(across(everything(), .fns = function(x) x != 0))
2 голосов
/ 17 июня 2020

Вы можете узнать индексы строк, в которых все значения не равны нулю во всем столбце, и выбрать все строки до 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 голос
/ 17 июня 2020

Параметр dplyr / tidyr может быть более интуитивным. Замените нули на NA, затем отбросьте все строки хотя бы с одним NA:

library(tidyverse)
df %>% 
  na_if(0) %>% 
  drop_na()
  A B C
1 4 3 7
2 3 3 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...