我有一种情况,我希望选择下一行的值来更新列,而不是满足条件的行。因此,传统的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
答案 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)]]