2

这是我的数据框:

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))

4

1 回答 1

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))
于 2013-05-01T10:22:26.293 回答