Сначала проверьте 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