捕获列模式频率

时间:2016-10-23 06:56:42

标签: r dplyr transform frequency reshape2

我有一个如下所示的数据集

Id        A      B       C
10        1      0       1
11        1      0       1
12        1      1       0
13        1      0       0
14        0      1       1

我正在尝试计算下面的列模式。

 Pattern         Count
 A, C            2
 A, B            1
 A               1
 B, C            1

不确定从哪里开始,非常感谢任何帮助或建议。

3 个答案:

答案 0 :(得分:4)

如果您不必按ID分组,那么只需

table(apply(df[-1], 1, function(i) paste(names(i[i == 1]), collapse = ',')))

#  A A,B A,C B,C 
#  1   1   2   1 

答案 1 :(得分:2)

我们可以试试

table(gsub(",*N|N,*", "", chartr('0123', 'NABC', 
         do.call(paste, c(df1[-1] * col(df1[-1]), sep=",")))))

#  A A,B A,C B,C 
#  1   1   2   1 

正如@DavidArenburg所提到的,old/new中的chartr可以通过

自动生成
cols <- paste(c("N", names(df1[-1])), collapse = "") 
indx <- paste(seq(nchar(cols)) - 1, collapse = "")
table(gsub(",*N|N,*", "", chartr(indx, cols, 
      do.call(paste, c(df1[-1] * col(df1[-1]), sep=",")))))

答案 2 :(得分:2)

从&#34;逆转&#34;开始两个单独的向量中的数据列表:

w = which(dat[-1] == 1L, TRUE)

我们可以使用

table(tapply(names(dat)[-1][w[, "col"]], w[, "row"], paste, collapse = ", "))
#
#   A A, B A, C B, C 
#   1    1    2    1

如果仅为了格式化目的而不需要结果,为了避免不必要的paste / strsplit,另一种选择 - 很多 - 是:

pats = split(names(dat)[-1][w[, "col"]], w[, "row"])
upats = unique(pats)
data.frame(pat = upats, n = tabulate(match(pats, upats)))
#   pat n
#1 A, C 2
#3 A, B 1
#4    A 1
#5 B, C 1