[英]Replacing row values in R based on previous rows
下面是我的数据框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
Base R解决方案,这似乎适合您:
df$T_D = df$A*!c(FALSE,diff(df$A,lag=1)==0),
查找顺序行之间的差异。 如果差异为1,则从A列获取条目,否则设置为0。
OUTPUT
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
dplyr
的窗口函数使此操作变得容易。 您可以使用lag
函数查看先前的值,并查看其是否等于当前值。 该表的第一行没有先前的值,因此T_D
始终为NA
。 幸运的是,该行将始终等于a
因此使用第二个变量(或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))
df$T_D <- sign(abs(df$A)*diff(c(0, df$A)))
数据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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.