代码之家  ›  专栏  ›  技术社区  ›  NinjaR

如果满足条件,则更新下一行中的值

  •  2
  • NinjaR  · 技术社区  · 7 年前

    A   B  C   D
    
    10 11  12  0
    1  13  14  0
    3   4  85  0
    78  56 56  0
    70  80 16  0
    60  67 86  0
    50  65 77  0
    

    预期的数据集是

    A   B  C   D
    
    10 11  12  0
    1  13  14  0
    3   4  85  0
    78  56 56  78
    70  80 16  0
    60  67 86  0
    50  65 77  50
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   akrun    7 年前

    我们可以用 ifelse

    library(tidyverse)
    df1 %>% 
        mutate(D = lag(ifelse(C > 80, lead(A), D), default = first(D)))
    #   A  B  C  D
    #1 10 11 12  0
    #2  1 13 14  0
    #3  3  4 85  0
    #4 78 56 56 78
    #5 70 80 16  0
    #6 60 67 86  0
    #7 50 65 77 50
    

    df1 %>% 
       mutate(D = lag((C > 80) * lead(A, default = last(A)), default = first(D)))
    

    也可以在 base R

    df1$D <-  with(df1, c(D[1], head((C > 80) * c(A[-1], A[length(A)]), -1)))
    

    数据

    df1 <- structure(list(A = c(10L, 1L, 3L, 78L, 70L, 60L, 50L), B = c(11L, 
    13L, 4L, 56L, 80L, 67L, 65L), C = c(12L, 14L, 85L, 56L, 16L, 
    86L, 77L), D = c(0L, 0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame", 
     row.names = c(NA, -7L))
    
        2
  •  1
  •   Ronak Shah    7 年前

    我们可以得到指数 C A 值并在中更新 D .

    inds <- which(df$C > 80) + 1
    df$D[inds] <- df$A[inds]
    
    
    df
    #   A  B  C  D
    #1 10 11 12  0
    #2  1 13 14  0
    #3  3  4 85  0
    #4 78 56 56 78
    #5 70 80 16  0
    #6 60 67 86  0
    #7 50 65 77 50
    

    C类 inds 小于或等于数据帧中的行数。

    df$D[inds[inds <= nrow(df)]] <- df$A[inds[inds <= nrow(df)]]