如果满足条件,则替换列的后续值

Nin*_*jaR 1 r

我有一个数据框,我想在符合条件的情况下将列的值替换为一定数量的行

示例数据帧

A     B      C

10    15     0
11    11     6
3     12     0
4     6      9
5     9      0
7     8      0
7     1      8
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

在R中没有循环的任何方法来实现这一点?

Ice*_*can 5

首先,检查一下which(df$C > 0).对于结果中的每个元素,添加1:5使用lapply.然后,使用unique(之后unlist)删除结果中的任何重复项.最后,确保没有行是大于nrow(df)pmin,并设置df$C等于0为那些行.

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

由于您最初标记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))
Run Code Online (Sandbox Code Playgroud)

编辑:实际上似乎unique步骤是不必要的.不确定是否存在重复索引的性能影响,或者如果与使用相比如何unique