r - 使用 colname 的长形式

标签 r tidyr melt

假设我有以下数据

 A <- c(4,4,4,4,4)
 B <- c(1,2,3,4,4)
 C <- c(1,2,4,4,4)
 D <- c(3,2,4,1,4)
 E <- c(4,4,4,4,5)

data <- data.frame(A,B,C,D,E)
data<- t(data)
colnames(data) = c("num1","freq1","freq2","freq3","totfreq")

> data
  num1 freq1 freq2 freq3 totfreq
A    4     4     4     4       4
B    1     2     3     4       4
C    1     2     4     4       4
D    3     2     4     1       4
E    4     4     4     4       5

我正在尝试绘制分组条形图。两者的 x 轴应该是我的变量 A:Eyfreq1freq2 的值>, freq3 代表每个字母。我还需要保留通过 totfreq 中的值绘制变量 A:E 的功能。

我知道我需要转换为长格式,但我在如何设置数据方面遇到了问题。不知何故,我需要 ABCDE 需要堆叠成一列,另一列堆叠freq1freq2freq3totfreq,然后最后一列值(value)。有什么建议如何实现这一点吗?

我希望最好在plotly中进行绘图,但ggplot也可以工作

最佳答案

首先,您有一个矩阵,但可能需要一个数据框。将其设为小标题会删除行名称,这是存储字母的位置,因此

as.data.frame(data) %>% rownames_to_column("id")

将为您提供一个包含字母id列的数据框。

您希望通过收集所有 freq 列将此数据转换为长格式。然后我添加一列来给出观察的类型;这不是必需的,但既然您说您想轻松过滤两种类型之一 - 组 freq1 等,或 totfreq - 这是一个方便的设置我经常使用的。

library(tidyverse)

A <- c(4,4,4,4,4)
B <- c(1,2,3,4,4)
C <- c(1,2,4,4,4)
D <- c(3,2,4,1,4)
E <- c(4,4,4,4,5)

data <- data.frame(A,B,C,D,E)
data<- t(data)
colnames(data) = c("num1","freq1","freq2","freq3","totfreq")

data_long <- as.data.frame(data) %>%
  rownames_to_column("id") %>%
  gather(key = var, value = value, freq1:totfreq) %>%
  mutate(type = ifelse(var == "totfreq", "total", "by_group"))

head(data_long)
#>   id num1   var value     type
#> 1  A    4 freq1     4 by_group
#> 2  B    1 freq1     2 by_group
#> 3  C    1 freq1     2 by_group
#> 4  D    3 freq1     2 by_group
#> 5  E    4 freq1     4 by_group
#> 6  A    4 freq2     4 by_group

使用type列,可以很容易地按类型过滤以进行绘图。这可以让您将过滤后的数据帧通过管道传输到 ggplot 之类的内容中,或者为您提供一列用于分面或映射到美学上。

# for grouped bar chart
data_long %>% filter(type == "by_group")
#>    id num1   var value     type
#> 1   A    4 freq1     4 by_group
#> 2   B    1 freq1     2 by_group
#> 3   C    1 freq1     2 by_group
#> 4   D    3 freq1     2 by_group
#> 5   E    4 freq1     4 by_group
#> 6   A    4 freq2     4 by_group
#> 7   B    1 freq2     3 by_group
#> 8   C    1 freq2     4 by_group
#> 9   D    3 freq2     4 by_group
#> 10  E    4 freq2     4 by_group
#> 11  A    4 freq3     4 by_group
#> 12  B    1 freq3     4 by_group
#> 13  C    1 freq3     4 by_group
#> 14  D    3 freq3     1 by_group
#> 15  E    4 freq3     4 by_group

# for total freqs
data_long %>% filter(type == "total")
#>   id num1     var value  type
#> 1  A    4 totfreq     4 total
#> 2  B    1 totfreq     4 total
#> 3  C    1 totfreq     4 total
#> 4  D    3 totfreq     4 total
#> 5  E    4 totfreq     5 total

reprex package 创建于 2018-05-17 (v0.2.0)。

关于r - 使用 colname 的长形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50396411/

相关文章:

r - ggplot 停止 geom_segment 在图例中显示 geom_boxplot

R:tidyr::spread 的编程替代方案?

r - 如何将元数据添加到小标题

r - Melt 和 dcast with/字符串连接

r - 将两个变量的数据从宽数据转换为长数据

html - 如何使用 Google 电子表格作为后端创建 HTML 数据输入表单

r - 即使指定,散点图填充在 ggplot2 中也不会改变

r - 如何 reshape 数据框以生成两列值(R 编程)

r - 如何在 ggplot2 geom_bar 中订购填充颜色

r - 使用 R 更正/整理数据