创建一个对变量具有不等数的计数表

时间:2016-09-23 05:19:38

标签: r

我有以下数据集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

我尝试使用以下代码,但由于第一列中没有DNDBIRD,因此显示错误,即列之间存在不等数量的变量:

countsd <-  data.frame(apply(zx, 2, count))

4 个答案:

答案 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