我有一个包含两列“ CaseID”和“ Event”的数据框,想知道ID = X的事件之后跟ID = Y的事件的频率。但是我只对具有相同CaseID的连续事件感兴趣。
命令
df <- data.frame(CaseID = c(1,1,1,2,2,2,3,3,3),
Event = c("A","B","C","A","B","D","B","C","E"))
df
table(df[1:nrow(df) -1, 2], df[2:nrow(df), 2])
产生
CaseID Event
1 1 A
2 1 B
3 1 C
4 2 A
5 2 B
6 2 D
7 3 B
8 3 C
9 3 E
A B C D E
A 0 2 0 0 0
B 0 0 2 1 0
C 1 0 0 0 1
D 0 1 0 0 0
E 0 0 0 0 0
C-> A和D-> B具有不同的CaseID,应为0,所以我要查找的是
B C D E
A 2 0 0 0
B 0 2 1 0
C 0 0 0 1
D 0 0 0 0
E 0 0 0 0
是否有任何一种优雅的方法可以基于两个连续的行向table-command添加条件?
本
答案 0 :(得分:2)
我们只能用相同的Event
制表连续的CaseID
:
> x <- diff(df$CaseID) == 0
> table(df[1:nrow(df) -1, 2][x], df[2:nrow(df), 2][x])
A B C D E
A 0 2 0 0 0
B 0 0 2 1 0
C 0 0 0 0 1
D 0 0 0 0 0
E 0 0 0 0 0
如果CaseID
可能是非数字的:
x <- df$CaseID[-1] == df$CaseID[-length(df$CaseID)]
table(df[1:nrow(df) -1, 2][x], df[2:nrow(df), 2][x])
答案 1 :(得分:0)
这是使用dplyr
的另一种方法:
library(dplyr)
df %>%
group_by(CaseID) %>%
mutate(Event2 = lag(Event)) %>%
{table(.$Event2, .$Event)}
A B C D E
A 0 2 0 0 0
B 0 0 2 1 0
C 0 0 0 0 1
D 0 0 0 0 0
E 0 0 0 0 0