我有大量的出院记录数据。每次放电都有程序代码,其中有许多列包含代码(原则代码,其他1,其他2 ...其他24)。我想获得20个特定代码的频率列表,因此我需要获得跨多个列的频率。任何帮助将不胜感激!
示例:
#Sample Data
ID <- c(112,113,114,115)
Sex <- c(1,0,1,0)
Princ_Code <- c(1,2,5,3)
Oth_Code_1 <- c(5,7,8,1)
Oth_Code_2 <- c(2,10,12,9)
discharges <- data.frame(ID,Sex,Princ_Code,Oth_Code_1, Oth_Code_2)
我希望获得列中特定代码的频率计数。 类似的东西:
x freq
1 2
2 2
3 1
12 1
答案 0 :(得分:1)
考虑这个问题的一种方法是将数据从宽格式(具有相同类型数据的多列)转换为高格式(其中每列与其他列完全不同)。我将使用tidyr
进行演示,但也有基本和data.table
方法。
out <- tidyr::gather(discharges, codetype, code, -ID, -Sex)
out
# ID Sex codetype code
# 1 112 1 Princ_Code 1
# 2 113 0 Princ_Code 2
# 3 114 1 Princ_Code 5
# 4 115 0 Princ_Code 3
# 5 112 1 Oth_Code_1 5
# 6 113 0 Oth_Code_1 7
# 7 114 1 Oth_Code_1 8
# 8 115 0 Oth_Code_1 1
# 9 112 1 Oth_Code_2 2
# 10 113 0 Oth_Code_2 10
# 11 114 1 Oth_Code_2 12
# 12 115 0 Oth_Code_2 9
你是否看到如何从&#34;宽&#34;到&#34; tall&#34;使问题看起来简单得多吗?在这里,您可以使用table
或xtabs
table(out$code)
# 1 2 3 5 7 8 9 10 12
# 2 2 1 2 1 1 1 1 1
xtabs(~code, data=out)
# code
# 1 2 3 5 7 8 9 10 12
# 2 2 1 2 1 1 1 1 1
或者您可以继续使用dplyr
个管道和tidyr
:
library(dplyr)
library(tidyr)
discharges %>%
gather(codetype, code, -ID, -Sex) %>%
group_by(code) %>%
tally()
# # A tibble: 9 × 2
# code n
# <dbl> <int>
# 1 1 2
# 2 2 2
# 3 3 1
# 4 5 2
# 5 7 1
# 6 8 1
# 7 9 1
# 8 10 1
# 9 12 1