วิธีแทนที่ค่าที่หายไป (NA) ใน R: na.omit & na.rm

ค่าที่หายไปในวิทยาศาสตร์ข้อมูลเกิดขึ้นเมื่อการสังเกตหายไปในคอลัมน์ของกรอบข้อมูลหรือมีค่าอักขระแทนค่าตัวเลข ค่าที่หายไปจะต้องถูกละทิ้งหรือแทนที่เพื่อที่จะได้ข้อสรุปที่ถูกต้องจากข้อมูล

ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีจัดการกับค่าที่หายไปด้วยไลบรารี dplyr ไลบรารี dplyr เป็นส่วนหนึ่งของระบบนิเวศน์ที่ใช้ในการวิเคราะห์ข้อมูล

แทนที่ค่าที่หายไปใน R

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้

กลายพันธุ์()

กริยาที่สี่ใน ไลบรารี dplyr มีประโยชน์ในการสร้างตัวแปรใหม่หรือเปลี่ยนค่าของตัวแปรที่มีอยู่

เราจะดำเนินการในสองส่วน เราจะได้เรียนรู้วิธีการ:

  • แยกค่าที่หายไปออกจากกรอบข้อมูล
  • ระบุค่าที่หายไปด้วยค่าเฉลี่ยและค่ามัธยฐาน

การใช้คำกริยา mutate() นั้นง่ายมาก เราสามารถสร้างตัวแปรใหม่โดยใช้รูปแบบนี้:

mutate(df, name_variable_1 = condition, ...)
arguments:
-df: Data frame used to create a new variable
-name_variable_1: Name and the formula to create the new variable
-...: No limit constraint. Possibility to create more than one variable inside mutate()

ไม่รวมค่าที่หายไป (NA)

วิธี na.omit() จากไลบรารี dplyr เป็นวิธีง่ายๆ ในการแยกค่าการสังเกตที่หายไป การลบ NA ทั้งหมดออกจากข้อมูลนั้นเป็นเรื่องง่าย แต่ไม่ได้หมายความว่าเป็นวิธีแก้ปัญหาที่สวยหรูที่สุด ในระหว่างการวิเคราะห์ ควรใช้หลากหลายวิธีในการจัดการกับค่าที่หายไป

เพื่อแก้ไขปัญหาการสังเกตการณ์ที่หายไป เราจะใช้ชุดข้อมูลไททานิค ในชุดข้อมูลนี้ เราสามารถเข้าถึงข้อมูลของผู้โดยสารบนเครื่องระหว่างที่เกิดโศกนาฏกรรม ชุดข้อมูลนี้มี NA จำนวนมากที่ต้องได้รับการดูแล

เราจะอัปโหลดไฟล์ csv จากอินเทอร์เน็ต จากนั้นตรวจสอบว่าคอลัมน์ใดมี NA หากต้องการส่งคืนคอลัมน์ที่มีข้อมูลขาดหายไป เราสามารถใช้โค้ดต่อไปนี้:

มาอัปโหลดข้อมูลและตรวจสอบข้อมูลที่ขาดหายไป

PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"
df_titanic <- read.csv(PATH, sep = ",")
# Return the column names containing missing observations
list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]
list_na

Output:

## [1] "age"  "fare"

ที่นี่

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

ระบุชื่อคอลัมน์ที่ไม่มีข้อมูล

อายุและค่าโดยสารของคอลัมน์มีค่าขาดหายไป

เราสามารถปล่อยมันไว้ด้วย na.omit()

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

Output:

## [1] 1045   13

ชุดข้อมูลใหม่ประกอบด้วย 1045 แถว เทียบกับ 1309 แถวกับชุดข้อมูลดั้งเดิม

ไม่รวมค่าที่หายไป

ใส่ข้อมูลที่ขาดหายไปด้วยค่าเฉลี่ยและค่ามัธยฐาน

นอกจากนี้เรายังสามารถใส่ค่าที่หายไป (เติม) ด้วยค่ามัธยฐานหรือค่าเฉลี่ยได้ แนวทางปฏิบัติที่ดีคือสร้างตัวแปรสองตัวแยกกันสำหรับค่าเฉลี่ยและค่ามัธยฐาน เมื่อสร้างขึ้นแล้ว เราสามารถแทนที่ค่าที่หายไปด้วยตัวแปรที่สร้างขึ้นใหม่ได้

เราจะใช้วิธี Apply เพื่อคำนวณค่าเฉลี่ยของคอลัมน์ด้วย NA มาดูตัวอย่างกัน

ขั้นตอน 1) ในช่วงต้นของบทช่วยสอน เราได้จัดเก็บชื่อคอลัมน์ที่มีค่าที่หายไปในรายการชื่อ list_na เราจะใช้รายการนี้

ขั้นตอน 2) ตอนนี้เราต้องคำนวณค่าเฉลี่ยด้วยอาร์กิวเมนต์ na.rm = TRUE อาร์กิวเมนต์นี้เป็นข้อบังคับเนื่องจากคอลัมน์มีข้อมูลขาดหายไป และสิ่งนี้บอกให้ R เพิกเฉยต่อข้อมูลเหล่านั้น

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

คำอธิบายรหัส:

เราผ่านข้อโต้แย้ง 4 ข้อในวิธีการสมัคร

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. รหัสนี้จะส่งคืนชื่อคอลัมน์จากวัตถุ list_na (เช่น "อายุ" และ "ค่าโดยสาร")
  • 2: คำนวณฟังก์ชันบนคอลัมน์
  • ความหมาย: คำนวณค่าเฉลี่ย
  • na.rm = TRUE: ละเว้นค่าที่หายไป

Output:

##      age     fare 
## 29.88113 33.29548

เราสร้างค่าเฉลี่ยของคอลัมน์ที่มีการสังเกตที่ขาดหายไปได้สำเร็จ ค่าทั้งสองนี้จะถูกนำมาใช้เพื่อแทนที่การสังเกตที่ขาดหายไป

ขั้นตอน 3) แทนที่ค่า NA

คำกริยากลายพันธุ์จากไลบรารี dplyr มีประโยชน์ในการสร้างตัวแปรใหม่ เราไม่จำเป็นต้องเปลี่ยนคอลัมน์เดิมเพื่อให้เราสามารถสร้างตัวแปรใหม่โดยไม่มี NA ได้ mutate ใช้งานง่าย เพียงเลือกชื่อตัวแปรและกำหนดวิธีสร้างตัวแปรนี้ นี่คือรหัสที่สมบูรณ์

# Create a new variable with the mean and median
df_titanic_replace <- df_titanic %>%
   mutate(replace_mean_age  = ifelse(is.na(age), average_missing[1], age),
   replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))

คำอธิบายรหัส:

เราสร้างตัวแปรขึ้นมาสองตัวคือ replacement_mean_age และแทนที่_mean_fare ดังนี้:

  • แทนที่_mean_age = ifelse (is.na (อายุ), ค่าเฉลี่ย _missing [1], อายุ)
  • แทนที่_mean_fare = ifelse (is.na (ค่าโดยสาร), เฉลี่ย _missing [2], ค่าโดยสาร)

หากอายุคอลัมน์มีค่าที่ขาดหายไป ให้แทนที่ด้วยองค์ประกอบแรกของ Average_missing (ค่าเฉลี่ยอายุ) มิฉะนั้นคงค่าเดิมไว้ ตรรกะเดียวกันสำหรับค่าโดยสาร

sum(is.na(df_titanic_replace$age))

Output:

## [1] 263

ดำเนินการเปลี่ยน

sum(is.na(df_titanic_replace$replace_mean_age))

Output:

## [1] 0

อายุคอลัมน์เดิมมีค่าที่หายไป 263 ค่า ในขณะที่ตัวแปรที่สร้างขึ้นใหม่ได้แทนที่ด้วยค่าเฉลี่ยของอายุตัวแปร

ขั้นตอน 4) เราสามารถแทนที่การสังเกตที่หายไปด้วยค่ามัธยฐานได้เช่นกัน

median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      median,
      na.rm =  TRUE)
df_titanic_replace <- df_titanic %>%
            mutate(replace_median_age  = ifelse(is.na(age), median_missing[1], age), 
            replace_median_fare = ifelse(is.na(fare), median_missing[2], fare))
head(df_titanic_replace)

Output:

ใส่ข้อมูลที่ขาดหายไปด้วยค่าเฉลี่ยและค่ามัธยฐาน

ขั้นตอน 5) ชุดข้อมูลขนาดใหญ่อาจมีค่าที่ขาดหายไปจำนวนมาก และวิธีการข้างต้นอาจเป็นเรื่องยุ่งยาก เราสามารถดำเนินการขั้นตอนข้างต้นทั้งหมดได้ในโค้ดบรรทัดเดียวโดยใช้เมธอด sapply() แม้ว่าเราจะไม่รู้จักหุบเขาแห่งค่าเฉลี่ยและค่ามัธยฐานก็ตาม

sapply ไม่ได้สร้าง กรอบข้อมูลดังนั้นเราจึงสามารถรวมฟังก์ชัน sapply() ภายใน data.frame() เพื่อสร้างวัตถุ data frame

# Quick code to replace missing values with the mean
df_titanic_impute_mean < -data.frame(
    sapply(
        df_titanic,
        function(x) ifelse(is.na(x),
            mean(x, na.rm = TRUE),
            x)))

สรุป

เรามีสามวิธีในการจัดการกับค่าที่หายไป:

  • ไม่รวมข้อสังเกตที่ขาดหายไปทั้งหมด
  • ใส่ร้ายด้วยค่าเฉลี่ย
  • ใส่ร้ายกับค่ามัธยฐาน

ตารางต่อไปนี้สรุปวิธีการลบข้อสังเกตที่หายไปทั้งหมด

ห้องสมุด วัตถุประสงค์ รหัส
ฐาน แสดงรายการข้อสังเกตที่ขาดหายไป
colnames(df)[apply(df, 2, anyNA)]
ดีพลีร์ ลบค่าที่หายไปทั้งหมด
na.omit(df)

การใส่ร้ายด้วยค่าเฉลี่ยหรือค่ามัธยฐานสามารถทำได้สองวิธี

  • การใช้สมัคร
  • การใช้ sapply
วิธี รายละเอียดเพิ่มเติม ข้อดี ข้อเสีย
ทีละขั้นตอนกับการสมัคร ตรวจสอบคอลัมน์ที่ขาดหายไป คำนวณค่าเฉลี่ย/ค่ามัธยฐาน เก็บค่า แทนที่ด้วย mutate() คุณรู้ค่าของค่าเฉลี่ย/ค่ามัธยฐาน เวลาดำเนินการมากขึ้น อาจช้าได้ด้วยชุดข้อมูลขนาดใหญ่
วิธีที่รวดเร็วด้วย sapply ใช้ sapply() และ data.frame() เพื่อค้นหาและแทนที่ค่าที่หายไปด้วยค่าเฉลี่ย/ค่ามัธยฐานโดยอัตโนมัติ รหัสสั้นและรวดเร็ว ไม่ทราบค่าการใส่ร้าย