R:跨多列的频率

时间:2018-03-07 22:49:24

标签: r count frequency

我有大量的出院记录数据。每次放电都有程序代码,其中有许多列包含代码(原则代码,其他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

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;使问题看起来简单得多吗?在这里,您可以使用tablextabs

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