我有以下数据集zx
:
#zx
A B C D
1 COW COW BIRD COW
2 COW BIRD COW COW
3 FLOWER DND BIRD DND
4 COW COW BIRD FLOWER
5 FLOWER FLOWER DND COW
6 FLOWER COW COW BIRD
我想创建一个看起来像这样的计数表:
A B C D
COW 3 3 2 3
BIRD 0 1 3 1
FLOWER 3 1 0 1
DND 0 1 1 1
我尝试使用以下代码,但由于第一列中没有DND
和BIRD
,因此显示错误,即列之间存在不等数量的变量:
countsd <- data.frame(apply(zx, 2, count))
答案 0 :(得分:1)
你可以这样做。 基本上,您在这里按行向量化数据框,然后创建表格。
> table(as.vector(t(zx)),rep(names(zx),nrow(zx)))
您将获得以下输出
A B C D
BIRD 0 1 3 1
COW 3 3 2 3
DND 0 1 1 1
FLOWER 3 1 0 1
答案 1 :(得分:1)
您可以使用apply
列。
基本上,将每个元素创建为factor
,其中所有唯一值都存在于数据框中levels
,然后计算列中该级别的频率。
apply(zx, 2, function(x) table(factor(x, levels = unique(unlist(zx)))))
# A B C D
#COW 3 3 2 3
#FLOWER 3 1 0 1
#BIRD 0 1 3 1
#DND 0 1 1 1
答案 2 :(得分:0)
要致电table
,请将您的数据融合为长格式,以便每个字母与其字词配对。 tidyr::gather
是执行此操作的一项功能:
library(tidyr)
zx %>% gather() %>% head()
## key value
## 1 A COW
## 2 A COW
## 3 A FLOWER
## 4 A COW
## 5 A FLOWER
## 6 A FLOWER
然后致电table
。您可以指定顺序,但默认情况下是为每个变量创建一个表,这是您想要的。但顺序是向后的,因此t
会重新排列:
zx %>% gather() %>% table() %>% t()
## key
## value A B C D
## BIRD 0 1 3 1
## COW 3 3 2 3
## DND 0 1 1 1
## FLOWER 3 1 0 1
答案 3 :(得分:0)
我们可以使用mtabulate
qdapTools
library(qdapTools)
t(mtabulate(zx))
# A B C D
#BIRD 0 1 3 1
#COW 3 3 2 3
#DND 0 1 1 1
#FLOWER 3 1 0 1