R带条件的频率表

时间:2018-10-04 11:06:30

标签: r

我有一个包含两列“ 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添加条件?

2 个答案:

答案 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