R apply(), lapply(), sapply(), tapply() พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

ฟังก์ชัน apply(), lapply(), sapply() และ tapply() ประกอบกันเป็นตระกูลฟังก์ชัน apply ในภาษา R ซึ่งเป็นทางเลือกแบบเวกเตอร์แทนการใช้ลูปโดยตรง โดยจะนำฟังก์ชันที่เลือกไปใช้กับเมทริกซ์ รายการ เวกเตอร์ และข้อมูลที่จัดกลุ่มไว้ เพื่อให้ได้ผลลัพธ์ที่กระชับ

  • 🔲 นำมาใช้(): เรียกใช้ฟังก์ชันกับแถวหรือคอลัมน์ของเมทริกซ์
  • 📋 ลัปพลี(): ใช้ฟังก์ชันกับแต่ละองค์ประกอบในลิสต์ และส่งคืนลิสต์
  • 📊 sapply(): เหมือนกับฟังก์ชัน lapply() แต่ลดความซับซ้อนของผลลัพธ์โดยการแสดงเป็นเวクター
  • 🗂️ tapply(): ใช้ฟังก์ชันกับกลุ่มที่กำหนดโดยตัวประกอบ
  • 🤖 ความช่วยเหลือจาก AI: AI แนะนำให้ใช้โค้ดประมวลผลแบบเวกเตอร์แทนการวนลูปที่ทำงานช้า

apply, lapply, sapply และ tapply ใน R

บทช่วยสอนนี้มีจุดมุ่งหมายเพื่อแนะนำคอลเลกชันฟังก์ชัน Apply() ฟังก์ชัน Apply() เป็นฟังก์ชันพื้นฐานที่สุดของคอลเลกชันทั้งหมด นอกจากนี้เรายังจะได้เรียนรู้ sapply(), lapply() และ tapply() สามารถดูคอลเลกชัน Apply แทนลูปได้

คอลเลกชัน Apply() มาพร้อมกับ จำเป็นมาก แพคเกจถ้าคุณ ติดตั้ง R ด้วย Anacondaฟังก์ชัน apply ใน R สามารถป้อนฟังก์ชันต่างๆ มากมายเพื่อดำเนินการแอปพลิเคชันซ้ำซ้อนกับคอลเล็กชันของอ็อบเจ็กต์ (กรอบข้อมูล รายการ เวกเตอร์ ฯลฯ) วัตถุประสงค์หลักของ apply() คือเพื่อหลีกเลี่ยงการใช้โครงสร้างลูปโดยชัดเจน ฟังก์ชันเหล่านี้สามารถใช้สำหรับรายการอินพุต เมทริกซ์ หรืออาร์เรย์ และ apply ฟังก์ชันใดๆ ก็สามารถส่งผ่านไปยัง apply() ได้

ใช้ฟังก์ชัน ()

สมัคร () ใช้ Data frame หรือ matrix เป็นอินพุตและให้เอาต์พุตเป็นเวกเตอร์ รายการ หรืออาร์เรย์ นำมาใช้ ฟังก์ชั่นในอาร์ ใช้เป็นหลักเพื่อหลีกเลี่ยงการใช้โครงสร้างลูปอย่างชัดเจน ถือเป็นคอลเลกชันพื้นฐานที่สุดที่สามารถใช้บนเมทริกซ์ได้

ฟังก์ชันนี้รับ 3 อาร์กิวเมนต์:

apply(X, MARGIN, FUN)
Here:
-x: an array or matrix
-MARGIN:  take a value or range between 1 and 2 to define where to apply the function:
-MARGIN=1`: the manipulation is performed on rows
-MARGIN=2`: the manipulation is performed on columns
-MARGIN=c(1,2)` the manipulation is performed on rows and columns
-FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>

ตัวอย่างที่ง่ายที่สุดคือการรวมเมทริกซ์กับคอลัมน์ทั้งหมด รหัส Apply(m1, 2, sum) จะใช้ฟังก์ชัน sum กับเมทริกซ์ 5×6 และส่งคืนผลรวมของแต่ละคอลัมน์ที่สามารถเข้าถึงได้ในชุดข้อมูล

m1 <- matrix(C<-(1:10),nrow=5, ncol=6)
m1
a_m1 <- apply(m1, 2, sum)
a_m1

Output:

Apply() ตัวอย่างฟังก์ชันใน R
ตัวอย่างฟังก์ชัน Apply() ใน R

แนวปฏิบัติที่ดีที่สุด: เก็บค่าก่อนที่จะพิมพ์ลงในคอนโซล

ฟังก์ชัน lapply()

ปัด() ฟังก์ชันนี้มีประโยชน์สำหรับการดำเนินการกับอ็อบเจ็กต์รายการและส่งคืนอ็อบเจ็กต์รายการที่มีความยาวเท่ากับชุดต้นฉบับ lappy() ส่งคืนรายการที่มีความยาวใกล้เคียงกับอ็อบเจ็กต์รายการอินพุต ซึ่งแต่ละองค์ประกอบเป็นผลลัพธ์ของการใช้ FUN กับองค์ประกอบที่สอดคล้องกันของรายการ Lapply ใน R รับรายการ เวกเตอร์ หรือกรอบข้อมูลเป็นอินพุตและให้เอาต์พุตในรายการ

lapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x	

l ใน lapply() ย่อมาจาก list ความแตกต่างระหว่าง lapply() และ Apply() อยู่ระหว่างการส่งคืนเอาต์พุต ผลลัพธ์ของ lapply() คือรายการ lapply() สามารถใช้กับวัตถุอื่น ๆ เช่นกรอบข้อมูลและรายการ

ฟังก์ชัน lapply() ไม่ต้องการ MARGIN

ตัวอย่างที่ง่ายมากคือการเปลี่ยนค่าสตริงของเมทริกซ์ให้เป็นตัวพิมพ์เล็กด้วยฟังก์ชัน tolower เราสร้างเมทริกซ์ด้วยชื่อของภาพยนตร์ชื่อดัง ชื่ออยู่ในรูปแบบตัวพิมพ์ใหญ่

movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)

Output:

## List of 4
## $:chr"spyderman"
## $:chr"batman"
## $:chr"vertigo"
## $:chr"chinatown"

เราสามารถใช้ unlist() เพื่อแปลงรายการให้เป็นเวกเตอร์

movies_lower <-unlist(lapply(movies,tolower))
str(movies_lower)

Output:

##  chr [1:4] "spyderman" "batman" "vertigo" "chinatown"

ฟังก์ชัน sapply()

เก่ง() ฟังก์ชั่นรับรายการ เวกเตอร์ หรือกรอบข้อมูลเป็นอินพุตและให้เอาต์พุตเป็นเวกเตอร์หรือ เมทริกซ์มีประโยชน์สำหรับการดำเนินการกับอ็อบเจ็กต์รายการและส่งคืนอ็อบเจ็กต์รายการที่มีความยาวเท่ากับชุดต้นฉบับ ฟังก์ชัน Sapply ใน R ทำหน้าที่เดียวกันกับฟังก์ชัน lapply() แต่ส่งคืนเวกเตอร์

sapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x

เราสามารถวัดความเร็วต่ำสุดและหยุดได้ping ระยะห่างของรถยนต์จากชุดข้อมูลรถยนต์

dt <- cars
lmn_cars <- lapply(dt, min)
smn_cars <- sapply(dt, min)
lmn_cars

Output:

## $speed
## [1] 4
## $dist
## [1] 2
smn_cars

Output:

## speed  dist 
##     4     2
lmxcars <- lapply(dt, max)
smxcars <- sapply(dt, max)
lmxcars

Output:

## $speed
## [1] 25
## $dist
## [1] 120
smxcars

Output:

## speed  dist 
##    25   120

เราสามารถใช้ฟังก์ชันที่ผู้ใช้สร้างขึ้นใน lapply() หรือ sapply() ได้ เราสร้างฟังก์ชันชื่อ avg เพื่อคำนวณค่าเฉลี่ยของค่าต่ำสุดและสูงสุดของเวกเตอร์

avg <- function(x) {  
  ( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars

เอาท์พุต

## speed  dist
##  14.5  61.0

Sapply ใน R มีประสิทธิภาพมากกว่า lapply() ในเอาต์พุตที่ส่งคืนเนื่องจาก sapply() เก็บค่า direclty ไว้ในเวกเตอร์ ในตัวอย่างถัดไป เราจะเห็นว่าไม่ได้เป็นเช่นนั้นเสมอไป

เราสามารถสรุปความแตกต่างระหว่าง apply(), sapply() และ `lapply() ได้ตามตารางต่อไปนี้:

ฟังก์ชัน ข้อโต้แย้ง วัตถุประสงค์ อินพุต เอาท์พุต
ใช้ ใช้(x, มาร์จิ้น, สนุก) ใช้ฟังก์ชันกับแถวหรือคอลัมน์หรือทั้งสองอย่าง กรอบข้อมูลหรือเมทริกซ์ เวกเตอร์ รายการ อาร์เรย์
ตบเบา ๆ ค่อยเป็นค่อยไป(X, FUN) ใช้ฟังก์ชันกับองค์ประกอบทั้งหมดของอินพุต รายการ เวกเตอร์ หรือกรอบข้อมูล รายการ
ชุ่มฉ่ำ เก่ง(X, FUN) ใช้ฟังก์ชันกับองค์ประกอบทั้งหมดของอินพุต รายการ เวกเตอร์ หรือกรอบข้อมูล เวกเตอร์หรือเมทริกซ์

เวกเตอร์สไลซ์

เราสามารถใช้ lapply() หรือ sapply() แทนกันได้เพื่อแบ่ง data frame เราสร้างฟังก์ชัน below_average() ที่ใช้เวกเตอร์ของค่าตัวเลขและส่งกลับเวกเตอร์ที่มีเฉพาะค่าที่สูงกว่าค่าเฉลี่ยอย่างเคร่งครัด เราเปรียบเทียบผลลัพธ์ทั้งสองด้วยฟังก์ชันที่เหมือนกัน ()

below_ave <- function(x) {  
    ave <- mean(x) 
    return(x[x > ave])
}
dt_s<- sapply(dt, below_ave)
dt_l<- lapply(dt, below_ave)
identical(dt_s, dt_l)

Output:

## [1] TRUE

ฟังก์ชัน tapply()

แตะ() คำนวณการวัด (ค่าเฉลี่ย ค่ามัธยฐาน ค่าต่ำสุด ค่าสูงสุด ฯลฯ..) หรือฟังก์ชันสำหรับตัวแปรแต่ละตัวในเวกเตอร์ เป็นฟังก์ชันที่มีประโยชน์มากที่ช่วยให้คุณสามารถสร้างเซตย่อยของเวกเตอร์ แล้วใช้ฟังก์ชันบางอย่างกับแต่ละเซตย่อยได้

tapply(X, INDEX, FUN = NULL)
Arguments:
-X: An object, usually a vector
-INDEX: A list containing factor
-FUN: Function applied to each element of x

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

เพื่อให้เข้าใจวิธีการทำงาน ลองใช้ชุดข้อมูลม่านตากัน ชุดข้อมูลนี้มีชื่อเสียงมากในโลกแห่งการเรียนรู้ของเครื่อง วัตถุประสงค์ของชุดข้อมูลนี้คือเพื่อทำนายประเภทของดอกไม้แต่ละชนิดจากสามสายพันธุ์: Sepal, Versicolor, Virginica ชุดข้อมูลจะรวบรวมข้อมูลสำหรับแต่ละสายพันธุ์เกี่ยวกับความยาวและความกว้าง

จากงานก่อนหน้านี้ เราสามารถคำนวณค่ามัธยฐานของความยาวของแต่ละชนิดได้ Taply ใน R เป็นวิธีที่รวดเร็วในการคำนวณนี้

data(iris)
tapply(iris$Sepal.Width, iris$Species, median)

Output:

##     setosa versicolor  virginica 
##        3.4        2.8        3.0

คำถามที่พบบ่อย

ฟังก์ชัน apply ไม่ได้เร็วกว่าลูป for เสมอไป ข้อดีหลักของมันคือโค้ดที่กระชับและอ่านง่าย การดำเนินการแบบเวกเตอร์กับเวกเตอร์ทั้งหมดมักจะเร็วกว่าทั้งสองแบบ

ฟังก์ชัน vapply() ทำงานคล้ายกับ sapply() แต่บังคับใช้ประเภทการส่งคืนเพื่อความปลอดภัย ในขณะที่ mapply() เป็นเวอร์ชันหลายตัวแปรที่ใช้ฟังก์ชันกับเวกเตอร์หลายตัวพร้อมกัน

ทั้งสองฟังก์ชันใช้ฟังก์ชันกับแต่ละองค์ประกอบของลิสต์หรือเวกเตอร์ โดย lapply() จะคืนค่าเป็นลิสต์เสมอ ในขณะที่ sapply() จะแปลงผลลัพธ์ให้เป็นเวกเตอร์เมื่อเป็นไปได้

ใช่แล้ว ผู้ช่วย AI สามารถแปลงลูปให้เป็นการเรียกใช้ apply หรือ sapply แนะนำฟังก์ชันที่เหมาะสมสำหรับข้อมูลของคุณ และอธิบายอาร์กิวเมนต์ต่างๆ เช่น MARGIN และ FUN ได้

เครื่องมือ AI สร้างโค้ด R แนะนำฟังก์ชันประยุกต์แบบเวกเตอร์ ตรวจจับข้อผิดพลาด และสรุปผลลัพธ์ ช่วยping นักวิเคราะห์ประมวลผลข้อมูลแบบ DataFrame ได้เร็วขึ้นและมีข้อผิดพลาดน้อยลง

สรุปโพสต์นี้ด้วย: