以下是我的数据框df
df <- data.frame(A=c(1,1,1,1,0,0,-1,-1,-1,1,1,1,1))
我希望有另一个变量T_D
,当A
或1
遇到-1
值的变化时,会保留第一个值并替换下一行0
预期产出:
A T_D
1 1
1 0
1 0
1 0
0 0
0 0
-1 -1
-1 0
-1 0
1 1
1 0
1 0
1 0
答案 0 :(得分:1)
dplyr
&#39; window functions让这一切变得简单。您可以使用lag
函数查看上一个值,看它是否等于当前值。表格的第一行没有前一个值,因此T_D
始终为NA
。幸运的是,该行始终等于a
,因此使用第二个mutate(或df[1,2] <- df[1,1]
)修复这个问题很容易。
library(tidyverse) # Loads dplyr and other useful packages
df <- tibble(a = c(1, 1, 1, 1, 0, 0, -1, -1, -1, 1, 1, 1, 1))
df %>%
mutate(T_D = ifelse(a == lag(a), 0, a)) %>%
mutate(T_D = ifelse(is.na(T_D), a, T_D))
答案 1 :(得分:1)
df$T_D <- sign(abs(df$A)*diff(c(0, df$A)))
答案 2 :(得分:1)
data.table
方法是,
library(data.table)
setDT(df)[, T_D := replace(A, duplicated(A), 0), by = rleid(A)][]
# A T_D
# 1: 1 1
# 2: 1 0
# 3: 1 0
# 4: 1 0
# 5: 0 0
# 6: 0 0
# 7: -1 -1
# 8: -1 0
# 9: -1 0
#10: 1 1
#11: 1 0
#12: 1 0
#13: 1 0
答案 3 :(得分:0)
Base R解决方案,这似乎对您有用:
df$T_D = df$A*!c(FALSE,diff(df$A,lag=1)==0),
找出连续行之间的差异。如果差值为1,则从A列获取条目,否则设置为0.
输出
A T_D
1 1 1
2 1 0
3 1 0
4 1 0
5 0 0
6 0 0
7 -1 -1
8 -1 0
9 -1 0
10 1 1
11 1 0
12 1 0
13 1 0