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

5

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

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

SSN是指个人社会安全号码,Auto、MtgHe、Personal和Other是贷款类别,“None”表示没有贷款。共有15种不同的贷款组合方式,另外还有一种可能性是“None”,代表没有任何贷款。例如,一个人可能只有汽车贷款,或者同时有汽车贷款和个人贷款,或者根本没有贷款。我想要统计每种不同组合方式的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

有什么办法可以在R中完成这个任务?虽然我的数据集有数万个案例,但任何帮助都将不胜感激。
3个回答

6

以下是必需的 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

或者更简洁的版本可以是:
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

仅供娱乐,这里是另一个(无序的)基础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

为了完整起见,以下是dplyr版本。

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

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

对于那些喜欢使用基础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

所以,这个dplyr函数将计算数据集中的所有唯一组合,然后添加计数吗? - user3067851
是的,它会按照您在count中指定的所有变量对数据进行分组(在数据集df之后)。然后,它会计算每个组的行数,并将数据压缩为每个组的1行,并添加计数列“n”。 - talat
dplyr 不是函数,而是一个包。通常你只需要加载 library(dplyr) 然后运行 count(...) 函数。 - thelatemail
哇!那真是太简单了!非常感谢。 - user3067851

3

使用aggregate实现基本的R语言解决方案:

aggregate(count ~ ., data=transform(dat[-1],count=1), FUN=sum )

#  Auto MtgHe Personal Other None count
#1    1     0        0     0    0     1
#2    1     1        0     0    0     2
#3    1     0        1     1    0     1
#4    0     0        0     0    1     3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接