我有一个数据框,其中包含三个不同国家(加拿大,墨西哥,美国)在两个不同时间点(现在和之前)的调查受访者拥有的电视和收音机的数量的数据:
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
中排除因子,或者是生成预期曲线的另一种方法?
答案 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)
结果是: