对数据框中的变量求和,并在ggplot中绘制总和

时间:2018-06-01 21:08:14

标签: r ggplot2 tidyr

我的数据框包含调查受访者现在和之前拥有的电视和无线电数量的数据:

DF <- data.frame(TV_now = as.numeric(c(4, 9, 1, 0, 4, NA)),
                 TV_before = as.numeric(c(4, 1, 2, 4, 5, 2)),
                 Radio_now = as.numeric(c(4, 5, 1, 5, 6, 9)),
                 Radio_before = as.numeric(c(6, 5, 3, 6, 7, 10)))

我想总结每个变量的总价值,然后创建一个条形图,显示调查受访者现在和之前拥有的电视和无线电的数量。

我可以手动创建一个新的数据框,其中只包含原始DF中每个变量的值的总和

DFsum <- data.frame(TV_now = as.numeric(c(sum(DF$TV_now,na.rm = TRUE))),
                    TV_before = as.numeric(c(sum(DF$TV_before,na.rm = TRUE))),
                    Radio_now = as.numeric(c(sum(DF$TV_now,na.rm = TRUE))),
                    Radio_before = as.numeric(c(sum(DF$Radio_before,na.rm = TRUE))))

然后使用tidyr执行以下操作:

library(tidyr)
library(ggplot2)
DFsum %>% 
  gather(key=Device, value=Number) %>% 
  ggplot(aes(x=Number,fill=Device)) + 
  geom_bar(aes(x = Device, y = Number), position = "dodge", stat = "identity")

这给了我想要的结果,但对于应该容易实现的东西似乎不必要地复杂化。有没有更简单的方法来绘制这个?

2 个答案:

答案 0 :(得分:2)

您可以使用dplyr::mutate_all简化代码,因为您要汇总所有列:

library(tidyverse)
library(ggplot2)

DF %>% mutate_all(funs(sum), na.rm = TRUE) %>%
  gather(key=Device, value=Number) %>% 
  ggplot(aes(x=Device,fill=Device)) + 
  geom_bar(aes(x = Device, y = Number), position = "dodge", stat = "identity")

答案 1 :(得分:1)

简化数据创建。 R知道4,9,1等是数字,你不需要as.numeric

DF <- data.frame(TV_now = c(4, 9, 1, 0, 4, NA),
                 TV_before = c(4, 1, 2, 4, 5, 2),
                 Radio_now = c(4, 5, 1, 5, 6, 9),
                 Radio_before = c(6, 5, 3, 6, 7, 10))

简化数据操作。首先整理你的数据(将其转换为长格式),然后做其他事情:

DF_long = gather(DF, key = "device") %>%
    group_by(device) %>%
    summarize(number = sum(value, na.rm = TRUE))

简化绘图。美学是继承的 - 你不需要多次指定它们。 geom_col优先geom_bar stat = "identity"。当每个x索引有一个组时,position = "dodge"什么都不做。

ggplot(aes(x = device, y = number, fill = device)) +
    geom_col()

enter image description here

我通常更喜欢自己做数据操作,但我们也可以依靠ggplot的堆叠条代替求和,制作整个代码:

gather(DF, key = "device", value = "number") %>%
    ggplot(aes(x = device, y = number, fill = device)) +
    geom_col()

基本方法

dev = colSums(DF, na.rm = TRUE)
barplot(dev, col = factor(names(dev)))

enter image description here