R语言 根据行号更改行和后续行的值

5q4ezhmt  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(136)

我有一个 Dataframe ,其中一些行的值为0。我想做一个代码,使接下来的几行也为0。

> head(df$n,n=20)
              df$n
1                0
2             9009
3                0
4                0
5                0
6                0
7                0
8             5410
9                0
10               0
11               0
12               0
13               0
14               0
15              32
16               0
17               0
18            1054
19               0
20               0

我想创建一个代码,将值为0的下五行转换为0。基本上,值为0的行是0,下五行也是0。
我试过了

for(j in 1:nrow(indx)){
for(i in 1:4){
  df$n[j+i]<-0
}
}

其中indx是包含所有0值行号的 Dataframe 。
这可以工作,但不正确。
如何获得所需的输出?

> head(df$n,n=20)
                  df$n
    1                0
    2                0
    3                0
    4                0
    5                0
    6                0
    7                0
    8             5410
    9                0
    10               0
    11               0
    12               0
    13               0
    14               0
    15              32
    16               0
    17               0
    18               0
    19               0
    20               0

编辑:抱歉语言不清楚。我的目标是将0后面的5个值转换为0。因为这是不正确的数据。
编辑2:我想这段代码对我有用。它有点原始。

for( i in 1:nrow(indx)){
  u<-indx[i,]
  df[u,]<-0
  df[u+1,]<-0
  df[u+2,]<-0
  df[u+3,]<-0
  df[u+4,]<-0
  df[u+5,]<-0
}

然而,它在末端引入额外的行,但是它工作。

tp5buhyn

tp5buhyn1#

如果我没理解错的话,你需要确保任何一串零都至少有5行长,除非它在数据的末尾。

library(dplyr)

df %>% 
  group_by(zero_run = cumsum(n == 0 & lag(n, default = 1) != 0)) %>% 
  mutate(
    zeros_consecutive = row_number(),
    n_new = ifelse(zero_run == 0 | zeros_consecutive > 5, n, 0)
  ) %>% 
  ungroup()
# # A tibble: 20 × 4
#       n zero_run zeros_consecutive n_new
#   <dbl>    <int>             <int> <dbl>
#  1     0        1                 1     0
#  2  9009        1                 2     0
#  3     0        2                 1     0
#  4     0        2                 2     0
#  5     0        2                 3     0
#  6     0        2                 4     0
#  7     0        2                 5     0
#  8  5410        2                 6  5410
#  9     0        3                 1     0
# 10     0        3                 2     0
# 11     0        3                 3     0
# 12     0        3                 4     0
# 13     0        3                 5     0
# 14     0        3                 6     0
# 15    32        3                 7    32
# 16     0        4                 1     0
# 17     0        4                 2     0
# 18  1054        4                 3     0
# 19     0        5                 1     0
# 20     0        5                 2     0

为了更好地演示该方法,我在helper列中保留了这些内容,但是您可以通过使用n = ifelse(...)代替n_new = ifelse(...)并添加select(!zeros_run:zeros_consecutive)来删除这些内容。

相关问题