计算唯一组合中的出现次数

use*_*851 3 combinations r unique

我有一个类似于下面的数据集:

SSN Auto    MtgHe   Personal    Other   None
A   1           1    0          0       0
B   1           1    0          0       0
C   1           0    0          0       0
D   1           0    1          1       0
E   0           0    0          0       1
F   0           0    0          0       1
G   0           0    0          0       1
Run Code Online (Sandbox Code Playgroud)

SSN是人,Auto,MtgHe,Personal,Other是贷款类别,'None'表示没有贷款.共有15种独特的可能贷款组合加上另外1种"无"的可能性,表示不存在贷款.因此,一个人可能只有汽车贷款,汽车和个人贷款,或者根本没有贷款.我想要一些具有不同组合的SSN.使用上面的表格结果如下:

Cnt Auto    MtgHe   Personal    Other   None
2   1           1    0          0       0
1   1           0    0          0       0
1   1           0    1          1       0
3   0           0    0          0       1
Run Code Online (Sandbox Code Playgroud)

关于如何在R中实现这一点的任何想法?我的数据集确实有成千上万的案例,但任何帮助都会受到赞赏.

谢谢.

Dav*_*urg 5

强制data.table版(唯一不会重新排序数据集的版本)

library(data.table)
setDT(df)[, .(Cnt = .N), .(Auto, MtgHe, Personal, Other, None)]
#    Auto MtgHe Personal Other None Cnt
# 1:    1     1        0     0    0   2
# 2:    1     0        0     0    0   1
# 3:    1     0        1     1    0   1
# 4:    0     0        0     0    1   3
Run Code Online (Sandbox Code Playgroud)

或者更短的版本可能

temp <- names(df)[-1]
setDT(df)[, .N, temp]
#    Auto MtgHe Personal Other None N
# 1:    1     1        0     0    0 2
# 2:    1     0        0     0    0 1
# 3:    1     0        1     1    0 1
# 4:    0     0        0     0    1 3
Run Code Online (Sandbox Code Playgroud)

而且只是为了好玩,这是另一个(无序)基础R版本

Cnt <- rev(tapply(df[,1], do.call(paste, df[-1]), length))
cbind(unique(df[-1]), Cnt)
#   Auto MtgHe Personal Other None Cnt
# 1    1     1        0     0    0   2
# 3    1     0        0     0    0   1
# 4    1     0        1     1    0   1
# 5    0     0        0     0    1   3
Run Code Online (Sandbox Code Playgroud)

还有dplyrcompletness 的附加版本

library(dplyr)
group_by(df, Auto, MtgHe, Personal, Other, None) %>% tally
# Source: local data frame [4 x 6]
# Groups: Auto, MtgHe, Personal, Other
# 
#   Auto MtgHe Personal Other None n
# 1    0     0        0     0    1 3
# 2    1     0        0     0    0 1
# 3    1     0        1     1    0 1
# 4    1     1        0     0    0 2
Run Code Online (Sandbox Code Playgroud)


tal*_*lat 3

一种选择是使用 dplyr 的count函数:

library(dplyr)
count(df, Auto, MtgHe, Personal, Other, None) %>% ungroup()
#Source: local data frame [4 x 6]
#
#  Auto MtgHe Personal Other None n
#1    0     0        0     0    1 3
#2    1     0        0     0    0 1
#3    1     0        1     1    0 1
#4    1     1        0     0    0 2
Run Code Online (Sandbox Code Playgroud)

对于那些喜欢基本 R 且无需订购的人:

x <- interaction(df[-1])
df <- transform(df, n = ave(seq_along(x), x, FUN = length))[!duplicated(x),-1]
#  Auto MtgHe Personal Other None n
#1    1     1        0     0    0 2
#3    1     0        0     0    0 1
#4    1     0        1     1    0 1
#5    0     0        0     0    1 3
Run Code Online (Sandbox Code Playgroud)