我有一個帶有一個變數 x 的資料框。我想創建一個新變數 y,當 x 從其先前值減少 2 時,它等于 1,否則等于 0。然后我想創建一個變數z,它在y最后等于1時保存x的值。我希望z的初始值為0。我無法弄清楚如何制作z。有什么建議嗎?
這是我想要獲得的(但對于大約 1000 行):
x y z
9 0 0
8 0 0
6 1 6
9 0 6
7 1 7
5 1 5
我在 dplyr 中嘗試過滯后、兼用功能,但無濟于事。
uj5u.com熱心網友回復:
library(dplyr)
library(tidyr)
df <- data.frame(x = c(9,8,6,10,9,7,5))
df %>%
mutate(y = (lag(x, default = x[1]) - x == 2),
z = ifelse(cumsum(y) > 0 & y == 0, NA, x * y)) %>%
fill(z, .direction = "down")
#> x y z
#> 1 9 0 0
#> 2 8 0 0
#> 3 6 1 6
#> 4 10 0 6
#> 5 9 0 6
#> 6 7 1 7
#> 7 5 1 5
由reprex 包于 2022-11-07 創建(v2.0.1)
uj5u.com熱心網友回復:
一種選擇:
df$y = 0L
df$y[-1] = (diff(df$x) == -2L)
df$z = data.table::nafill(ifelse(df$y == 1L, df$x, NA), "locf", fill = 0L)
# x y z
# 1 9 0 0
# 2 8 0 0
# 3 6 1 6
# 4 9 0 6
# 5 7 1 7
# 6 5 1 5
可重現的資料(請下次提供)
df = data.frame(x = c(9L,8L,6L,9L,7L,5L))
uj5u.com熱心網友回復:
這是使用dplyr.
library(dplyr)
tmp = data.frame(x = c(9,8,6,9,7,5))
tmp %>%
mutate(y = ifelse(lag(x) - x == 2, 1, 0)) %>%
mutate(z = ifelse(y == 1, x, lag(x))) %>%
replace(is.na(.), 0)
# output
# x y z
# 1 9 0 0
# 2 8 0 0
# 3 6 1 6
# 4 9 0 6
# 5 7 1 7
# 6 5 1 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529075.html
標籤:r数据框dplyr
上一篇:從任意R代碼創建函式?
下一篇:按日期和類別匹配(2路匹配)
