R 使用ggplot以有效的方式显示异常值

R 使用ggplot以有效的方式显示异常值,r,ggplot2,R,Ggplot2,我拥有的实际数据(和目标)不同,但出于复制目的,我使用了泰坦尼克号数据集。我的目标是为每个班级和性别创建一个年龄异常值(1倍SD)图 因此,我做的第一件事是计算sd值和范围: library(dplyr) library(ggplot2) #Load titanic set titanic <- read.csv("titanic_total.csv") group <- group_by(titanic, Pclass, Sex) #Create outlier ranges

我拥有的实际数据(和目标)不同,但出于复制目的,我使用了泰坦尼克号数据集。我的目标是为每个班级和性别创建一个年龄异常值(1倍SD)图

因此,我做的第一件事是计算sd值和范围:

library(dplyr)
library(ggplot2)

#Load titanic set
titanic <- read.csv("titanic_total.csv")
group <- group_by(titanic, Pclass, Sex)

#Create outlier ranges
summarise <- summarise(group, mean=mean(Age), sd=sd(Age))
summarise <- as.data.frame(summarise)
summarise$outlier_max <- summarise$mean + summarise$sd
summarise$outlier_min <- summarise$mean - summarise$sd

#Create a key
summarise$key <- paste0(summarise$Pclass, summarise$Sex)

#Create a key for the base set
titanic$key <- paste0(titanic$Pclass, titanic$Sex)

total_data <- left_join(titanic, summarise, by = "key")
total_data$outlier <- 0

然而,这似乎不是解决这个问题的最简单方法。关于如何加入最佳实践以提高效率的任何想法。

减少代码并减少重复性的一种方法是,借助管道将所有代码整合到一个过程中。与其用值创建摘要,不如将其与数据重新连接,基本上可以在一个
mutate
步骤中完成:

titanic %>% 
  mutate(Pclass = as.factor(Pclass)) %>% 
  group_by(Pclass, Sex) %>% 
  mutate(Age.mean = mean(Age), 
         Age.sd = sd(Age), 
         outlier.max = Age.mean + Age.sd, 
         outlier.min = Age.mean - Age.sd, 
         outlier = as.factor(ifelse(Age > outlier.max, 1, 
                                    ifelse(Age < outlier.min, 1, 0)))) %>% 
  ggplot() +
    geom_point(aes(Age, Pclass, colour = outlier)) +
    facet_grid(.~Sex)
加号: 此外,您甚至可以进一步减少代码,具体取决于您希望以何种方式保留哪些变量:

titanic %>% 
    group_by(Pclass, Sex) %>% 
    mutate(outlier = as.factor(ifelse(Age > (mean(Age) + sd(Age)), 1, 
                                      ifelse(Age < (mean(Age) - sd(Age)), 1, 0)))) %>% 
    ggplot() +
    geom_point(aes(Age, as.factor(Pclass), colour = outlier)) +
    facet_grid(.~Sex)
泰坦尼克号%>%
分组依据(P类,性别)%>%
突变(离群值=as.factor(如果其他(年龄)>(平均(年龄)+sd(年龄)),1,
ifelse(年龄<(平均(年龄)-sd(年龄)),1,0)))%>%
ggplot()+
几何点(aes(年龄、as.因子(Pclass)、颜色=异常值))+
平面网格(.~Sex)

您可以用矢量化的
ifelse
替换
循环:
总数据$outlier outlier\u max |年龄
ggplot(total_data, aes(x = Age, y = Pclass.x, colour = outlier)) + geom_point() +
 facet_grid(. ~Sex.x)
titanic %>% 
  mutate(Pclass = as.factor(Pclass)) %>% 
  group_by(Pclass, Sex) %>% 
  mutate(Age.mean = mean(Age), 
         Age.sd = sd(Age), 
         outlier.max = Age.mean + Age.sd, 
         outlier.min = Age.mean - Age.sd, 
         outlier = as.factor(ifelse(Age > outlier.max, 1, 
                                    ifelse(Age < outlier.min, 1, 0)))) %>% 
  ggplot() +
    geom_point(aes(Age, Pclass, colour = outlier)) +
    facet_grid(.~Sex)
...
rowwise() %>% 
    mutate(outlier = as.factor(as.numeric(between(Age, outlier.min, outlier.max)))) %>% ...
titanic %>% 
    group_by(Pclass, Sex) %>% 
    mutate(outlier = as.factor(ifelse(Age > (mean(Age) + sd(Age)), 1, 
                                      ifelse(Age < (mean(Age) - sd(Age)), 1, 0)))) %>% 
    ggplot() +
    geom_point(aes(Age, as.factor(Pclass), colour = outlier)) +
    facet_grid(.~Sex)