Как удалить ведущие и конечные строки по условию в R? - PullRequest
0 голосов
/ 04 апреля 2019

Существует набор данных с начальными и конечными строками, которые имеют функцию с нулевым значением. Как изящно уронить такие строки?

# Library
library(tidyverse)

# 1. Input
data.frame(
  id = c(1:10),
  value = c(0, 0, 1, 3, 0, 1, 2, 8, 9, 0))

# 2. Delete leading and trimming rows with 'value = 0'
# ...

# 3. Desired outcome
data.frame(
  id = c(3:9),
  value = c(1, 3, 0, 1, 2, 8, 9))

Спасибо.

Ответы [ 3 ]

5 голосов
/ 04 апреля 2019

Опция будет

library(dplyr)   
df1 %>% 
  filter( cumsum(value) > 0 & rev(cumsum(rev(value)) > 0))
#  id value
#1  3     1
#2  4     3
#3  5     0
#4  6     1
#5  7     2
#6  8     8
#7  9     9
1 голос
/ 04 апреля 2019

Один из вариантов - проверить, равно ли значение 0, а rleid(value) минимально или максимально (т. Е. Вы находитесь в первой или последней группе значений). Это будет работать, даже если ненулевые значения, которые вы хотите сохранить, отрицательны.

library(data.table)
setDT(df)

df[!(value == 0 & (rid <- rleid(value)) %in% range(rid))]

#    id value
# 1:  3     1
# 2:  4     3
# 3:  5     0
# 4:  6     1
# 5:  7     2
# 6:  8     8
# 7:  9     9

Если вы заранее знаете, что первое и последнее значения всегда будут нулями, вы можете просто проверить второе условие

df[!((rid <- rleid(value)) %in% range(rid))]
1 голос
/ 04 апреля 2019

Ниже может быть легко взломать:

df %>%
  mutate(value2 = cumsum(value)) %>%
  filter(value2 != 0) %>%
  filter(!(value2 == max(value2) & value == 0)) %>%
  select(-value2)
  id value
1  3     1
2  4     3
3  5     0
4  6     1
5  7     2
6  8     8
7  9     9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...