每个元素在它所存在的列中出现多少次?

时间:2013-05-01 09:57:34

标签: r

这是我的数据框:

a d c
d a b
b e c 
e b b
c c e
f f d

在这个数据框架中,我想知道:
每个元素在它所存在的列中出现多少次? 然后我想将它们存储在一个矩阵中 所以矩阵看起来像这样:

1 1 0
1 1 2
1 1 2
1 1 1
1 1 1
1 1 

有没有人有任何简单的代码片段来执行此操作?感谢大家的帮助。

另一个数据框

     [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    1    1    1    1
 [2,]    1    1    1    1    1    1
 [3,]   -1   -1   -1    1    1    1
 [4,]   -1   -1   -1    1    1    1
 [5,]    2    2   -2    1   -1   -1
 [6,]    2    2   -2    1   -1   -1
 [7,]   -2   -2    2    1   -1   -1
 [8,]   -2   -2    2    1   -1   -1
 [9,]    3   -3    3   -1    1   -1
[10,]    3   -3    3   -1    1   -1
[11,]   -3    3   -3   -1    1   -1
[12,]   -3    3   -3   -1    1   -1
[13,]    4   -4   -4   -1   -1    1
[14,]    4   -4   -4   -1   -1    1
[15,]   -4    4    4   -1   -1    1
[16,]   -4    4    4   -1   -1    1

可以使用do.call(cbind, tapply(unlist(df), gl(ncol(df),nrow(df)), table))

1 个答案:

答案 0 :(得分:4)

您基本上只需要在每列上调用table

df = read.table(text="a d c
d a b
b e c 
e b b
c c e
f f d", header=FALSE)

df_counts = lapply(
  df,
  function(x) {
    table(factor(x, levels=c("a", "b", "c", "d", "e", "f")))
  }
)
df_counts = matrix(unlist(df_counts), ncol=3)

输出:

     [,1] [,2] [,3]
[1,]    1    1    0
[2,]    1    1    2
[3,]    1    1    2
[4,]    1    1    1
[5,]    1    1    1
[6,]    1    1    0

对同一个想法略有不同的实现:

do.call(cbind, tapply(unlist(df), gl(ncol(df),nrow(df)), table))