我正在嘗試創建一個變數,當兩行在另一個變數 (x) 上不同時,該變數采用變數 (z) 的值。因此,如果 x 的行號 1 和 2 不同(從第 2 行開始),我希望 z 取值為 1,否則為 0。
我已經嘗試過基于這個問題的不同 if 和 if-else 句子(For Loop that References the Previous Row in R),但它沒有給我想要的結果。
df <-
data.frame(
x = c(1, 1, 2, 0, 0, 0, 0, 1, 1, 2),
y = c(1, 1, 2, 0, 0, 0, 0, 1, 1, 2),
z = c(0, 1, 2, 0, 0, 0, 0, 1, 1, 2)
)
for (i in 2:length(df)) {
df$z <- ifelse(df$x[i] != df$x[i - 1], 1, 0)
}
for (i in 2:length(df)) {
if (df$x[i] != df$x[i - 1]) {
df$z == 1
} else{
df$z == 0
}
}
我的預期結果是:
df_expected <-
data.frame(
x = c(1, 1, 2, 0, 0, 0, 0, 1, 1, 2),
y = c(1, 1, 2, 0, 0, 0, 0, 1, 1, 2),
z = c(NA, 1, 1, 1, 0, 0, 0, 1, 0, 1)
)
非常感謝!
uj5u.com熱心網友回復:
編輯
如果您需要使用for-loop,您可以使用
df$z <- 0
for (i in 2:nrow(df)) {
df[i, "z"] <- (df[i, "x"] != df[i - 1, "x"])
}
您的代碼的問題是:
df$z == 1
不分配任何東西,是邏輯比較。
你可以用
library(dplyr)
df %>%
mutate(z = (x != lag(x, default = first(x))))
這回傳
x y z
1 1 1 0
2 1 1 0
3 2 2 1
4 0 0 1
5 0 0 0
6 0 0 0
7 0 0 0
8 1 1 1
9 1 1 0
10 2 2 1
uj5u.com熱心網友回復:
使用 data.table
library(data.table)
setDT(df)[, z := as.integer(x != shift(x, fill = first(x)))]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/325800.html
上一篇:如何僅獲取整數或浮點數輸入
