Заменить последующие значения столбца, если выполняется условие - PullRequest
0 голосов
/ 09 января 2019

У меня есть фрейм данных, в котором я хочу заменить значения столбца до определенного числа строк, если выполняется условие

Пример кадра данных

A     B      C

10    15     0
11    11     6
3     12     0
4     6      9
5     9      0
7     8      0
7     1      8

Если значение какой-либо строки в C больше 0, то следующие 5 значений C необходимо заменить на 0, что приведет к следующему кадру данных

A     B      C

10    15     0
11    11     6
3     12     0
4     6      0
5     9      0
7     8      0
7     1      0

Есть ли способы добиться этого без петель в R?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Это операция «скользящего окна», поэтому я предлагаю использовать zoo::rollapply.

dat <- read.table(header=TRUE, text='
A     B      C
10    15     0
11    11     6
3     12     0
4     6      9
5     9      0
7     8      0
7     1      8')

zoo::rollapply(dat$C, 5+1, FUN=function(a) {
  l <- length(a)
  if (any(a[-l] != 0)) 0 else a[l]
}, fill = NA, align = "right", partial = TRUE)
# [1] 0 6 0 0 0 0 0

(я использовал 5+1, чтобы обозначить, что нам нужно на одну строку больше, чем строки, которые мы хотим очистить, на что указывает a[-l]. Большое спасибо @IceCreamToucan за указание на это.)

0 голосов
/ 09 января 2019

Сначала проверьте which(df$C > 0). Для каждого элемента в результатах добавьте 1:5, используя lapply. Затем удалите все дубликаты в результатах с помощью unique (после unlist ing). Наконец, убедитесь, что ни одна строка не превышает nrow(df) с pmin, и установите df$C равным 0 для этих строк.

df$C[pmin(nrow(df), unique(unlist(lapply(which(df$C > 0), `+`, 1:5))))] <- 0

Так как вы изначально пометили dplyr, вот метод tidyverse (не изменяющий df, если вы не назначите результат для df)

library(tidyverse)

inds <- 
  which(df$C > 0) %>% 
    map(~ . + 1:5) %>% 
    unlist %>% 
    unique %>% 
    pmin(nrow(df))

df %>% 
  mutate(C = replace(C, inds, 0))

edit: фактически кажется, что шаг unique не нужен. Не уверен, есть ли какое-либо влияние на производительность, если оставить повторяющиеся индексы, или если да, то как это сравнить с использованием unique

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...