如何对R Dataframe 中的多列进行计数和分组?

plupiseo  于 2023-01-15  发布在  其他
关注(0)|答案(4)|浏览(177)

一个非常基本的问题......我有一个类似下面的数据框,其中的数字表示分数:

df<-data.frame(A=c(1,2,1,1,3,3,2,2),B=c(2,2,2,3,2,3,3,1),C=c(1,1,1,1,1,2,2,3))

我想将其更改为以下格式,以便在堆叠条形图中绘制:

我知道如何以一种非常迂回的、可能过于复杂的方式去做,任何关于更“精简”的方式去做的建议都将是非常受欢迎的!提前感谢!

xfyts7mz

xfyts7mz1#

dplyr解决方案可能更具可扩展性,但另一种基于R的方法是:使用do.call沿着lapplytable,然后将其全部放入 Dataframe 中:

data.frame(Name = rep(c("A", "B", "C"), each = 3),
      Score = rep(1:3, each = 3),
      Frequency = do.call(c, lapply(df[], table)))

#     Name Score Frequency
# A.1    A     1         3
# A.2    A     1         3
# A.3    A     1         2
# B.1    B     2         1
# B.2    B     2         4
# B.3    B     2         3
# C.1    C     3         5
# C.2    C     3         2
# C.3    C     3         1
l5tcr1uw

l5tcr1uw2#

library(tidyverse)

df %>% 
  pivot_longer(everything(), names_to = "Score") %>% 
  count(Score, value, name = "Freq")

# A tibble: 9 × 3
  Score value  Freq
  <chr> <dbl> <int>
1 A         1     3
2 A         2     3
3 A         3     2
4 B         1     1
5 B         2     4
6 B         3     3
7 C         1     5
8 C         2     2
9 C         3     1
7rfyedvj

7rfyedvj3#

使用base R

as.data.frame(table(stack(df)[2:1]))
  ind values Freq
1   A      1    3
2   B      1    1
3   C      1    5
4   A      2    3
5   B      2    4
6   C      2    2
7   A      3    2
8   B      3    3
9   C      3    1
deyfvvtc

deyfvvtc4#

我们可以将数据转换为长格式,然后计算频率

df%>%
  gather(Name,Score,A:C)%>%
  group_by(Name,Score)%>%
  summarise(Frequency=n())%>%
  ungroup

  Name  Score Frequency
  <chr> <dbl>     <int>
1 A         1         3
2 A         2         3
3 A         3         2
4 B         1         1
5 B         2         4
6 B         3         3
7 C         1         5
8 C         2         2
9 C         3         1

相关问题