使用r

时间:2015-12-15 21:54:59

标签: r

目标:了解两个人在一组案件中出现的频率。

我的原始数据包含一个法院案件编号,后面跟着包含每个案件涉及人员标识符的字段。每种情况最多可以有15人。

看起来像这样:

case_formatted person1 person2 person3 person4 .... 
1234            A         B       C       D
2345            B         E       F
3456            F         B       G 
4567            A
5678            D         F

我使用融合功能使数据更加垂直。它现在看起来像这样:

case_formatted     person_variable     person_value
1234                   Person 1              A
2345                   Person 1              B    
3456                   Person 1              F        
4567                   Person 1              A
5678                   Person 1              D

等等通过一个可能的Person15,每次出现一个案例编号(case_formatted)时,会有另外一个人列出。

我现在如何找出每个人在同一个案件中出现的频率?最终,我希望每个可能的配对频率。在这个例子中,人B和人F一起出现了多少个案例?总共约有2,000个案例。

1 个答案:

答案 0 :(得分:0)

我提出了以下方法:

#Your sample data
df <- data.frame(case_formatted = c(1234, 2345, 3456, 4567, 5678), 
                 person1 = c("A","B","F","A","D"), 
                 person2 = c("B","E","B", NA,"F"), 
                 person3 = c("C","F","G", NA, NA), 
                 person4 = c("D", NA, NA, NA, NA),
                 stringsAsFactors =  F)

#Names of all persons
persons <- c("A", "B", "C", "D", "E", "F", "G")

#Case IDs
cases <- df$case_formatted

#Transpose to Matrix
df.t <- as.data.frame(t(df[2:ncol(df)]))

#Make logical matrix
d <- as.data.frame(t(sapply(df.t, function(x) persons %in% x)))
colnames(d) <- persons
e <- cbind(Case.ID = cases, d)

#Output
e
   Case.ID     A     B     C     D     E     F     G
V1    1234  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
V2    2345 FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
V3    3456 FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
V4    4567  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
V5    5678 FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE

此数据框现在列出了所有案例ID以及所有可能出现在其中的人员。

一种可能性是使用Hadley Wickham的包装&#39; dplyr&#39;轻松处理数据。它有一个非常直观的界面来处理数据,例如。

library(dplyr)
e %>% filter(A == TRUE & B == TRUE)

将显示A在法庭上的所有行(法庭案件),B在法庭上。

  Case.ID    A    B    C    D     E     F     G
1    1234 TRUE TRUE TRUE TRUE FALSE FALSE FALSE

因此,对于样本数据,它发生了一次。如果您一直使用相同类型的查询,您也可以编写一个函数,例如

howMany <- function(first, second, data = e) {
  together <- data %>% filter_(paste0(first,' == T',' & ',second, ' == T'))
  output <- paste(first, 'and', second, 'appeared', length(together[,1]), 'x together in court.')
  cat(output)
}

那么你可以使用:

howMany('A','C')

A and C appeared 1 x together in court.