내가 가진 실제 데이터 (및 목표)는 다르지만 재생산 목적으로 타이타닉 데이터 세트를 사용했습니다. 나의 목표는 학급과 성별에 대해 연령 이상치 (1 회 SD)를 작성하는 것입니다.ggplot을 사용하여 효율적인 방법으로 특이 치를 표시
따라서 나는 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
다음, 내가 나이가 내부 또는 범위 밖에 있는지 여부를 확인 루프를 사용하는
for (row in 1:nrow(total_data)){
if((total_data$Age[row]) > (total_data$outlier_max[row])){
total_data$outlier[row] <- 1
} else if ((total_data$Age[row]) < (total_data$outlier_min[row])){
total_data$outlier[row] <- 1
} else {
total_data$outlier[row] <- 0
}
}
않는 일부 데이터 정리 중 ...
total_data$Pclass.x <- as.factor(total_data$Pclass.x)
total_data$outlier <- as.factor(total_data$outlier)
이제이 코드는 내가 원하는 그림을 제공합니다.
ggplot(total_data, aes(x = Age, y = Pclass.x, colour = outlier)) + geom_point() +
facet_grid(. ~Sex.x)
그러나 실제로는이 문제를 해결하는 가장 쉬운 방법은 아닙니다. 이 효율성을 높이기위한 모범 사례를 어떻게 포함 할 수 있는지에 대한 생각.
당신은 벡터화'ifelse'으로'for' 루프를 대체 할 수 : 코드를 추가, 당신은 어떤 방법으로 유지하려는 변수에 따라 달라'total_data의 $의 이상치 <- (total_data, ifelse (나이와 > outlier_max | Age
LAP