Таблица частот R с условием - PullRequest
0 голосов
/ 04 октября 2018

У меня есть фрейм данных с двумя столбцами, «CaseID» и «Event», и я хочу знать, как часто за Event с ID = X следует Event с 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

Есть ли какой-нибудь элегантный способ добавить условие в команду таблицы, основанное на двух последовательных строках?

Бен

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вот альтернативный подход с использованием 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
0 голосов
/ 04 октября 2018

Мы можем табулировать только последовательные 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...