是否存在用于多列频率表的循环以生成条形图?

问题描述 投票:-1回答:1

我有以下数据:

df1<-read.table(text="Class1	Class2	Class3	M1	M2	M3	Z1	Z2	Z3
C	E	D	Apple	Apple	Apple	Orange	Orange	Orange
A	B	B	Orange	Orange	Orange	Orange	Orange	Orange
                A	C	A	Orange	Orange	Orange	Apple	Orange	Apple
                B	A	D	Orange	Apple	Apple	Apple	Orange	Apple
                C	B	B	Orange	Orange	Apple	Apple	Apple	Apple
                A	D	C	Orange	Orange	Apple	Orange	Apple	Orange
                E	C	B	Apple	Orange	Apple	Apple	Orange	Apple
                D	A	B	Apple	Orange	Apple	Apple	Orange	Orange
                E	D	E	Orange	Orange	Orange	Apple	Apple	Apple
                C	C	A	Apple	Orange	Apple	Apple	Apple	Apple
                E	C	A	Orange	Apple	Orange	Orange	Orange	Orange
                C	B	D	Apple	Apple	Apple	Orange	Apple	Apple
                E	E	D	Apple	Orange	Apple	Orange	Apple	Orange
                E	A	B	Orange	Apple	Apple	Orange	Orange	Apple
                A	D	E	Apple	Orange	Apple	Orange	Orange	Apple
                E	B	D	Apple	Apple	Orange	Apple	Apple	Apple
                D	C	B	Orange	Orange	Apple	Apple	Orange	Orange
                A	C	C	Apple	Apple	Apple	Apple	Orange	Orange
                E	B	A	Apple	Orange	Apple	Orange	Apple	Apple
                E	C	A	Orange	Apple	Apple	Apple	Apple	Apple
           ",header=TRUE) 

我想使用循环来识别频率表。例如,M1和Z1的类为1,M2和Z2的类为2,M3和Z3的类为3,依此类推。每个表的原型表是:

Class	M1-Apple	M1_Orange	Z1_Apple	Z1_Orange
A	x	x	x	x
B	x	x	x	x
C	x	x	x	x
D	x	x	x	x
E	x	x	x	x

接下来,我想为每个表格生成条形图。

我已经尝试过:

class<-df1[1:3]
 MZ<-df1[4:9]
df2<-lapply(1:3, function(x) table(class[,x] ~ MZ[,x]))

所以我需要图表。我认为我们需要先映射变量,然后使用lappy运行这些图。有没有人帮忙?

r for-loop ggplot2 lapply frequency-distribution
1个回答
-1
投票

[如果我正确理解了您想要的东西,那么这很大程度上是重塑数据from wide to long format的练习,因此我们首先使用pivot_longer中的tidyr 1.0.0进行操作(您可能需要升级)。我进行了两次旋转,因为我发现它更容易思考,但是旋转可以一次完成:

library(tidyverse)

long_data <- df1 %>% 
  pivot_longer(everything(),
               names_to = c(".value", "set"),
               names_pattern = "([A-Za-z]+)(.)") %>%
  pivot_longer(-c(set, Class), 
               names_to = "type",
               values_to = "fruit") %>%
  select(set, class = Class, type, fruit)

head(long_data)
#> # A tibble: 6 x 4
#>   set   class type  fruit 
#>   <chr> <fct> <chr> <fct> 
#> 1 1     C     M     Apple 
#> 2 1     C     Z     Orange
#> 3 2     E     M     Apple 
#> 4 2     E     Z     Orange
#> 5 3     D     M     Apple 
#> 6 3     D     Z     Orange

[set此处的变量对应于您之前在各列中使用的整数后缀。现在我们总结一下这些数据:

counts <- long_data %>% group_by_all %>% count

head(counts)
#> # A tibble: 6 x 5
#> # Groups:   set, class, type, fruit [6]
#>   set   class type  fruit      n
#>   <chr> <fct> <chr> <fct>  <int>
#> 1 1     A     M     Apple      2
#> 2 1     A     M     Orange     3
#> 3 1     A     Z     Apple      2
#> 4 1     A     Z     Orange     3
#> 5 1     B     M     Orange     1
#> 6 1     B     Z     Apple      1

如果需要,您可以将其重塑为更宽的格式,以使其成为矩阵形状,但是我将其放在此处,因为我收集到您对绘图部分感兴趣,为此我们需要长格式无论如何。

因此,最后是情节。您所追求的图并不完全清楚,但是根据数据来看,以下对我来说最有意义:

ggplot(counts, aes(x = class, y = n, fill = fruit)) +
  geom_histogram(position = "dodge",
                 stat = "identity") +
  facet_wrap(~set)
#> Warning: Ignoring unknown parameters: binwidth, bins, pad

“”

reprex package(v0.3.0)在2019-12-01创建

如果需要其他内容,请尝试aesfacet_wrap变量。

© www.soinside.com 2019 - 2024. All rights reserved.