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

时间:2019-01-10 14:45:09

标签: r dplyr plyr

我有一种情况,我希望选择下一行的值来更新列,而不是满足条件的行。因此,传统的ifelse不适用于我。

例如,如果列C的值大于80,则我希望列D的值更新为列A的值,但在下一行中。虚拟数据集是

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 个答案:

答案 0 :(得分:4)

我们可以使用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))

答案 1 :(得分:1)

我们可以得到C大于80的索引,将其递增1。获取相应的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

如@G所述。 Grothendieck,如果C中的最后一个值大于80,则将返回错误。在这种情况下,我们仅更新小于或等于数据帧中行数的inds

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