วิธีแทนที่ค่าที่หายไป (NA) ใน R: na.omit & na.rm
ค่าที่หายไปในวิทยาศาสตร์ข้อมูลเกิดขึ้นเมื่อการสังเกตหายไปในคอลัมน์ของกรอบข้อมูลหรือมีค่าอักขระแทนค่าตัวเลข ค่าที่หายไปจะต้องถูกละทิ้งหรือแทนที่เพื่อที่จะได้ข้อสรุปที่ถูกต้องจากข้อมูล
ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีจัดการกับค่าที่หายไปด้วยไลบรารี dplyr ไลบรารี dplyr เป็นส่วนหนึ่งของระบบนิเวศน์ที่ใช้ในการวิเคราะห์ข้อมูล
ในบทช่วยสอนนี้ คุณจะได้เรียนรู้
กลายพันธุ์()
กริยาที่สี่ใน ไลบรารี 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() เพื่อค้นหาและแทนที่ค่าที่หายไปด้วยค่าเฉลี่ย/ค่ามัธยฐานโดยอัตโนมัติ | รหัสสั้นและรวดเร็ว | ไม่ทราบค่าการใส่ร้าย |