这是我的数据框:
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))
答案 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))