数据框中每个唯一组合的频率

3
在一个数据集中(N=6000),我想分析15个虚拟变量的组合发生频率。
ID       Var1        Var2       Var3    Var15

1          1          0          0        1

2          0          1          1        1

3          1          0          0        0

6000       1          0          0        0

对于这个例子,我希望看到的是数字1000出现了两次,1001出现了一次,0111也出现了一次。
我唯一能想到的方法是为每个可能的组合计算一个变量...
是否有一种优雅而高效的方法来做到这一点?
我已经阅读了如何总结所有可能的变量组合? 但那是一个稍微不同的问题,聚合记数器超出了我的知识范围(但如果那是我的问题的答案,我会去研究它)。
5个回答

4
您可以像这样使用count:
df = read.table(text = "
ID       Var1        Var2       Var3    Var15
1          1          0          0        1
2          0          1          1        1
3          1          0          0        0
6000       1          0          0        0
", header=T)

library(dplyr)

df %>% count(Var1, Var2, Var3, Var15)

# # A tibble: 3 x 5
#     Var1  Var2  Var3 Var15     n
#    <int> <int> <int> <int> <int>
# 1     0     1     1     1     1
# 2     1     0     0     0     2
# 3     1     0     0     1     1

如果您不想输入(很多)列名,请使用count_

input_names = names(df)[-1]  # select all column names apart from 1st one

df %>% count_(input_names)

# # A tibble: 3 x 5
#    Var1  Var2  Var3 Var15     n
#   <int> <int> <int> <int> <int>
# 1     0     1     1     1     1
# 2     1     0     0     0     2
# 3     1     0     0     1     1

如果您想将变量分组并创建一个单一的(组合)变量,可以执行以下操作:
library(dplyr)
library(tidyr)

input_names = names(df)[-1]

df %>% count_(input_names) %>% unite_("ComboVar",input_names,sep="")

# # A tibble: 3 x 2
#   ComboVar     n
# * <chr>    <int>
# 1 0111         1
# 2 1000         2
# 3 1001         1

非常感谢您的快速回复。我会尝试一下。 - Sem
1
运行得很好,再次感谢! - Sem
我很困惑,因为它不包含出现0次的组合,这怎么有帮助呢? - cs0815
1
@cs0815他们明确指定了他们想要的输出形式,我的回答是基于那个的。你应该尝试使用library(tidyverse); df %>% count(Var1, Var2, Var3, Var15) %>% complete(Var1, Var2, Var3, Var15, fill = list(n = 0))来获取不存在的组合的零值。 - AntoniosK
@AntoniosK 谢谢 - 我可能忽略了那部分 - 抱歉 - cs0815

3

使用dplyr包,您可以:

library(dplyr)
df %>% group_by(Var1, Var2, Var3, Var15) %>% tally

2

一个基本的R解决方案是使用table。以AntoniosK的示例df为例:

df = read.table(text = "
ID       Var1        Var2       Var3    Var15
1          1          0          0        1
2          0          1          1        1
3          1          0          0        0
6000       1          0          0        0
", header=T)

res <- as.data.frame(table(df[,2:5]))

#> res
#   Var1 Var2 Var3 Var15 Freq
#1     0    0    0     0    0
#2     1    0    0     0    2
#3     0    1    0     0    0
#4     1    1    0     0    0
#5     0    0    1     0    0
#6     1    0    1     0    0
#7     0    1    1     0    0
#8     1    1    1     0    0
#9     0    0    0     1    0
#10    1    0    0     1    1
#11    0    1    0     1    0
#12    1    1    0     1    0
#13    0    0    1     1    0
#14    1    0    1     1    0
#15    0    1    1     1    1
#16    1    1    1     1    0

与其他示例不同的是,这个示例给出了零频率。如果您不想要这些零频率的示例,那么可以简单地执行以下操作:
res[res$Freq>0,]

1
SPSS解决方案也可以简单地进行聚合。 以下语法将在新数据集中放置计数:
DATASET DECLARE comb.
AGGREGATE  /OUTFILE='comb' /BREAK=var1 to var15 /Noccurences=N.

您也可以像这样将计数添加到当前数据集中:
AGGREGATE /OUTFILE=* MODE=ADDVARIABLES /BREAK=var1 var2 var3 /Noccurences=N.

0
一个 plyr 选项:
plyr::count(df[-1])

#   Var1 Var2 Var3 Var15 freq
#1    0    1    1     1    1
#2    1    0    0     0    2
#3    1    0    0     1    1

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