R中数据帧的行比较



我有一个数据帧,每个ID对应多个数据点。当一个ID的状态值在两个时间点之间不同时,我想标记第一个状态更改。我如何在R中实现这一点?下面是一个示例数据集。

ID 时间 状态
ID1 0 X
ID1 6 X
ID1 12 Y
ID1 18 Z

这里是一个带有ave的基本R解决方案。每当上一个值与当前值不同时,它就会创建一个等于1的向量y。然后用CCD_ 4来计算CCD_。

y <- with(df1, ave(Status, ID, FUN = function(x) c(0, x[-1] != x[-length(x)])))
df1$Flag <- c(0, diff(as.integer(y)) != 0)
df1
#   ID Time Status Flag
#1 ID1    0      X    0
#2 ID1    6      X    0
#3 ID1   12      Y    1
#4 ID1   18      Z    0

数据

df1 <- read.table(text = "
ID  Time    Status
ID1     0   X
ID1     6   X
ID1     12  Y
ID1     18  Z                  
", header = TRUE)

您可以将mutate((与ifelse((和lag((一起使用,然后用replace((将非第一个Flag==1替换为0s:

df1%>%group_by(ID)%>%
mutate(Flag=ifelse(is.na(lag(Status)), 0,
as.integer(Time!=lag(Time) & Status!=lag(Status))))%>%
group_by(ID, Flag)%>%
mutate(Flag=replace(Flag, Flag==lag(Flag) & Flag==1, 0))
# A tibble: 4 x 4
# Groups:   ID, Flag [2]
ID     Time Status  Flag
<fct> <int> <fct>  <dbl>
1 ID1       0 X          0
2 ID1       6 X          0
3 ID1      12 Y          1
4 ID1      18 Z          0

相关内容

  • 没有找到相关文章

最新更新