【问题标题】:Row wise comparison of a dataframe in RR中数据帧的逐行比较
【发布时间】:2021-05-26 16:42:49
【问题描述】:
我有一个数据框,其中包含与每个 ID 对应的多个数据点。当 ID 的 2 个时间点之间的状态值不同时,我想标记第一次状态更改。我如何在 R 中实现这一点?下面是一个示例数据集。
| ID |
Time |
Status |
| ID1 |
0 |
X |
| ID1 |
6 |
X |
| ID1 |
12 |
Y |
| ID1 |
18 |
Z |
结果数据集
| ID |
Time |
Status |
Flag |
| ID1 |
0 |
X |
|
| ID1 |
6 |
X |
|
| ID1 |
12 |
Y |
1 |
| ID1 |
18 |
Z |
|
【问题讨论】:
标签:
r
compare
row
data-manipulation
data-transform
【解决方案1】:
这是带有ave 的基本 R 解决方案。它创建一个向量y,每当前一个值与当前值不同时,它就等于 1。然后用diff 计算Flag。
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)
【解决方案2】:
您可以将mutate()与ifelse()和lag()一起使用,然后用replace()将非第一个Flag==1替换为0:
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