绘制除一个变量外的所有变量的总和

时间:2018-06-29 18:52:19

标签: 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)),
                 Country = as.factor(c("Mexico", "Canada", "US", "US", "Canada", "US")))

我想对每个变量的总和求和,然后创建一个条形图,显示现在和之前每个国家/地区被调查受访者拥有的电视和收音机的数量。

现在,如果我的数据框不包含Country因子,则可以通过以下方式生成图:

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")

但是,变体

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

导致错误:

Error in mutate_impl(.data, dots) : 
  Evaluation error: ‘sum’ not meaningful for factors.

是否有一种方法可以从sum中排除因子,或者是生成预期曲线的另一种方法?

1 个答案:

答案 0 :(得分:2)

您可以使用摘要功能来汇总不同的列。下面,我使用dplyr的summarise_if()函数总结了数字列。

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)),
             Country = as.factor(c("Mexico", "Canada", "US", "US", "Canada", "US")))

DF %>%
        group_by(Country) %>%
        summarise_if(is.numeric,sum,na.rm=TRUE) %>%
        gather(key=Device, value=Number, -Country) %>% 
        ggplot(aes(x=Device,fill=Device)) + 
        geom_bar(aes(x = Device, y = Number),position = "dodge", stat = "identity") + 
        facet_wrap(~Country)

结果是:

Results plot