我有一些数据:
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
非常感谢您的帮助!
答案 0 :(得分:3)
使用dplyr
和tidyr
,我们可以将数据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
中,gather
和spread
分别被pivot_longer
和pivot_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))