我有一个数据框,我想在符合条件的情况下将列的值替换为一定数量的行
示例数据帧
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中没有循环的任何方法来实现这一点?
首先,检查一下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