我有下面的数据框,想按grp列分组,看看每个列值中有多少出现在每个组中.

> data.frame(grp = unlist(strsplit("aabbccca", "")), col1=unlist(strsplit("ABAABBAB", "")), col2=unlist(strsplit("BBCCCCDD", "")))
  grp col1 col2
1   a    A    B
2   a    B    B
3   b    A    C
4   b    A    C
5   c    B    C
6   c    B    C
7   c    A    D
8   a    B    D

预期结果:

  grp col1A col1B col2B col2C col2D
1   a    1    2     2     0     1
2   b    2    0     0     2     0
3   c    1    2     0     2     1

如果我只看grpcol1列,使用table()很容易解决这个问题,当只有2列时,我可以将table(df[c('grp', 'col1')])table(df[c('grp', 'col2')])合并.然而,随着因子列数量的增加,这会变得非常麻烦,如果col1col2之间存在共享值,则会出现问题.

请注意,dplyr的计数不起作用,因为它寻找col1和col2的唯一组合.

我try 过用tidyr融化和传播数据帧,但没有任何运气

> pivot_longer(df, c(col1, col2), names_to= "key", values_to = "val") %>% pivot_wider("grp", names_from = c("key", "val"), values_from = 1, values_fn = sum)
Error in `stop_subscript()`:
! Can't subset columns that don't exist.
x Column `grp` doesn't exist.

我可以找到很多解决方案,适用于我有一个组列和一个值列的情况,但我不知道如何将它们推广到更多列.

推荐答案

你可以堆叠col1&;col2一起,计算每个组合的数量,然后将表格转换为一个大表格.

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(col1:col2) %>%
  count(grp, name, value) %>%
  pivot_wider(grp, names_from = c(name, value), names_sort = TRUE,
              values_from = n, values_fill = 0)

# A tibble: 3 x 6
  grp   col1_A col1_B col2_B col2_C col2_D
  <chr>  <int>  <int>  <int>  <int>  <int>
1 a          1      2      2      0      1
2 b          2      0      0      2      0
3 c          1      2      0      2      1

base个解决方案(感谢@GKi完善代码):

table(cbind(df["grp"], col=do.call(paste0, stack(df[-1])[2:1])))

   col
grp col1A col1B col2B col2C col2D
  a     1     2     2     0     1
  b     2     0     0     2     0
  c     1     2     0     2     1

R相关问答推荐

用预测NLS处理R中生物学假设之上的误差传播

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

在R中为马赛克图中的每个字段着色

在R中使用数据集名称

如何改变x轴比例的列在面

使用across,starts_with和ifelse语句变更多个变量

在ggplot中为不同几何体使用不同的 colored颜色 比例

Data.table';S GForce-将多个函数应用于多列(带可选参数)

为什么在BASE R中绘制线条时会看到线上的点?

如何使用For-R循环在向量中找到一系列数字

当每个变量值只能 Select 一次时,如何从数据框中 Select 两个变量的组合?

如何计算增加10米(0.01公里)的行?

有没有办法一次粘贴所有列

为什么我对圆周率图的蒙特卡罗估计是空的?

如何更改包中函数中的参数?

我有2011-2022年的年度数据.如何计算最低年份和最高年份之间的差额?

R中的交叉表

用逗号拆分字符串,并删除一些字符

有没有一种方法可以用非标准参数编写一个定制的ggploy主题函数?

当某些实验治疗被审查了75%时,使用/后继测试意味着在r中使用