R-按组对多列中的值进行计数

时间:2019-07-30 11:26:07

标签: r

我有一些数据:

df <- data.frame(v1 = c('lapse','gone','active','lapse','lapse','active','active','active','gone'),
                 v2 = c('gone','gone','active','lapse','active','lapse','active','lapse','lapse'),
                 v3 = c('gone','gone','gone','gone','active','active','lapse','lapse','lapse'),
                 v4 = c('active','gone','lapse','gone','lapse','gone','lapse','active','lapse'))

我需要计算按“失效”,“消失”和“活跃”分组的每一列中的观察值。 我需要它看起来像这样:

   group     v1     v2     v3     v4
1  lapse     3      4      3      4
2  gone      2      2      4      3
3  active    4      3      2      2

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

使用dplyrtidyr,我们可以将数据gather转换为长格式,count的频率,然后spread转换为宽格式。 / p>

library(dplyr)
library(tidyr)

df %>%
  gather(key, value) %>%
  count(key, value) %>%
  spread(key, n, fill = 0)

# A tibble: 3 x 5
#  value     v1    v2    v3    v4
#  <chr>  <int> <int> <int> <int>
#1 active     4     3     2     2
#2 gone       2     2     4     3
#3 lapse      3     4     3     4

在新版本的tidyr中,gatherspread分别被pivot_longerpivot_wider取代。因此,可以通过以下方式完成

df %>%
  pivot_longer(cols = names(df)) %>%
  count(name, value) %>%
  pivot_wider(names_from = name, values_from = n, values_fill = list(n = 0))

答案 1 :(得分:2)

您也可以尝试:

table(stack(df))

        ind
values   v1 v2 v3 v4
  active  4  3  2  2
  gone    2  2  4  3
  lapse   3  4  3  4

答案 2 :(得分:0)

我们可以使用melt/dcast

library(reshape2)
dcast(melt(as.matrix(df)), value ~ Var2)
#   value v1 v2 v3 v4
#1 active  4  3  2  2
#2   gone  2  2  4  3
#3  lapse  3  4  3  4

base R

中的一个选项
table(names(df)[col(df)], unlist(df))