目标:了解两个人在一组案件中出现的频率。
我的原始数据包含一个法院案件编号,后面跟着包含每个案件涉及人员标识符的字段。每种情况最多可以有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个案例。
答案 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.