计算唯一组组合中的出现次数
count occurrences in unique group combination
我有一个类似于下面的数据集:
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 种独特的可能贷款组合加上 1 种 'None' 的其他可能性,表示不存在贷款。因此,一个人可能只有汽车贷款,或者汽车和个人贷款,或者根本没有贷款。我想要一些具有各种不同组合的 SSN。使用上面的 table 结果如下:
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 中实现这一点有什么想法吗?我的数据集确实有数万个案例,但我们将不胜感激。
一个选项,使用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
对于那些喜欢 base 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
Base R 解决方案使用 aggregate
:
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
以及强制性 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
我有一个类似于下面的数据集:
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 种独特的可能贷款组合加上 1 种 'None' 的其他可能性,表示不存在贷款。因此,一个人可能只有汽车贷款,或者汽车和个人贷款,或者根本没有贷款。我想要一些具有各种不同组合的 SSN。使用上面的 table 结果如下:
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 中实现这一点有什么想法吗?我的数据集确实有数万个案例,但我们将不胜感激。
一个选项,使用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
对于那些喜欢 base 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
Base R 解决方案使用 aggregate
:
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
以及强制性 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