按具有列名 (R) 的类别分类的图
Plot classified by categories with column-names (R)
我有一个具有下一个结构的数据框:
D1A1 D1A2 D1A3 D1B1 D1B2 D1B3 D2A1 D2A2 D2A3 D2B1 D2B2 D2B3
10 12 15 40 39 27 11 13 14 33 31 32
实际数据框具有更大的维度(40 个观察值/列)。我的兴趣是创建任何一种可能的图表,显示所有数字信息以及按列分类(D1A、D1B、D2A、D2B)聚类的数据,如下所示:
D1A1+D1A2+D1A3 || D1B1+D1B2+D1B3 || D2A1+D2A2+D2A3 || D2B1+D2B2+D2B3
只要我感到非常失落,任何建议都将不胜感激。
我们可以通过列名的子字符串拆分数据集,遍历 list
得到 rowSums
并使用 barplot
out <- sapply(split.default(df1, sub("\d+$", "", names(df1))),
rowSums, na.rm = TRUE)
barplot(out)
如果有更多行并且想要绘制,请使用 tidyverse
,我们可以通过使用列名称中的模式,即捕获末尾没有数字的列名子串。这将创建 4 列。然后,我们使用 summarise
和 across
来获取每列的 sum
和 return 条形图 - geom_col
library(dplyr)
library(tidyr)
library(ggplot2)
df2 %>%
pivot_longer(cols = everything(), names_to = ".value",
names_pattern = "(.*)\d+$") %>%
summarise(across(everything(), sum, na.rm = TRUE)) %>%
pivot_longer(cols = everything()) %>%
ggplot(aes(x = name, y = value, fill = name)) +
geom_col()
-输出
如果我们对数据的传播感兴趣,箱线图可以提供帮助。在这里,我们不使用 summarise
,而是使用 geom_boxplot
而不是 geom_col
df2 %>%
pivot_longer(cols = everything(), names_to = ".value",
names_pattern = "(.*)\d+$") %>%
pivot_longer(cols = everything()) %>%
ggplot(aes(x = name, y = value, fill = name)) +
geom_boxplot()
数据
df1 <- structure(list(D1A1 = 10L, D1A2 = 12L, D1A3 = 15L, D1B1 = 40L,
D1B2 = 39L, D1B3 = 27L, D2A1 = 11L, D2A2 = 13L, D2A3 = 14L,
D2B1 = 33L, D2B2 = 31L, D2B3 = 32L), class = "data.frame", row.names = c(NA,
-1L))
df2 <- structure(list(D1A1 = c(10L, 15L), D1A2 = c(12L, 23L), D1A3 = 15:14,
D1B1 = c(40L, 23L), D1B2 = c(39L, 14L), D1B3 = c(27L, 22L
), D2A1 = 11:10, D2A2 = c(13L, 15L), D2A3 = c(14L, 17L),
D2B1 = c(33L, 35L), D2B2 = c(31L, 35L), D2B3 = c(32L, 32L
)), class = "data.frame", row.names = c(NA, -2L))
我有一个具有下一个结构的数据框:
D1A1 D1A2 D1A3 D1B1 D1B2 D1B3 D2A1 D2A2 D2A3 D2B1 D2B2 D2B3
10 12 15 40 39 27 11 13 14 33 31 32
实际数据框具有更大的维度(40 个观察值/列)。我的兴趣是创建任何一种可能的图表,显示所有数字信息以及按列分类(D1A、D1B、D2A、D2B)聚类的数据,如下所示:
D1A1+D1A2+D1A3 || D1B1+D1B2+D1B3 || D2A1+D2A2+D2A3 || D2B1+D2B2+D2B3
只要我感到非常失落,任何建议都将不胜感激。
我们可以通过列名的子字符串拆分数据集,遍历 list
得到 rowSums
并使用 barplot
out <- sapply(split.default(df1, sub("\d+$", "", names(df1))),
rowSums, na.rm = TRUE)
barplot(out)
如果有更多行并且想要绘制,请使用 tidyverse
,我们可以通过使用列名称中的模式,即捕获末尾没有数字的列名子串。这将创建 4 列。然后,我们使用 summarise
和 across
来获取每列的 sum
和 return 条形图 - geom_col
library(dplyr)
library(tidyr)
library(ggplot2)
df2 %>%
pivot_longer(cols = everything(), names_to = ".value",
names_pattern = "(.*)\d+$") %>%
summarise(across(everything(), sum, na.rm = TRUE)) %>%
pivot_longer(cols = everything()) %>%
ggplot(aes(x = name, y = value, fill = name)) +
geom_col()
-输出
如果我们对数据的传播感兴趣,箱线图可以提供帮助。在这里,我们不使用 summarise
,而是使用 geom_boxplot
geom_col
df2 %>%
pivot_longer(cols = everything(), names_to = ".value",
names_pattern = "(.*)\d+$") %>%
pivot_longer(cols = everything()) %>%
ggplot(aes(x = name, y = value, fill = name)) +
geom_boxplot()
数据
df1 <- structure(list(D1A1 = 10L, D1A2 = 12L, D1A3 = 15L, D1B1 = 40L,
D1B2 = 39L, D1B3 = 27L, D2A1 = 11L, D2A2 = 13L, D2A3 = 14L,
D2B1 = 33L, D2B2 = 31L, D2B3 = 32L), class = "data.frame", row.names = c(NA,
-1L))
df2 <- structure(list(D1A1 = c(10L, 15L), D1A2 = c(12L, 23L), D1A3 = 15:14,
D1B1 = c(40L, 23L), D1B2 = c(39L, 14L), D1B3 = c(27L, 22L
), D2A1 = 11:10, D2A2 = c(13L, 15L), D2A3 = c(14L, 17L),
D2B1 = c(33L, 35L), D2B2 = c(31L, 35L), D2B3 = c(32L, 32L
)), class = "data.frame", row.names = c(NA, -2L))