R Academy · บทเรียน

ฟังก์ชันหน้าต่าง: lag, lead, cumsum

คำนวณผลรวมสะสม ค่าเลื่อนตำแหน่ง และค่ารวมสะสมภายในกลุ่ม

บทเรียน 2 จาก 413 ขั้นตอน

ฟังก์ชันหน้าต่าง: lag, lead, cumsum เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

ฟังก์ชันหน้าต่างคืออะไร

ฟังก์ชันหน้าต่างคำนวณค่าโดยอ้างอิงจากแถวปัจจุบัน โดยไม่ยุบข้อมูล ต่างจาก summarize() ตรงที่ยังคงเก็บทุกแถวไว้ ใน dplyr ฟังก์ชันหน้าต่างจะใช้ภายใน mutate() ซึ่งมักใช้หลัง group_by()

library(dplyr)

# Monthly revenue — we want to compare each month to previous
df <- data.frame(
  month = 1:6,
  revenue = c(100, 120, 95, 140, 160, 130)
)
print(df)

lag() — ค่าจากแถวก่อนหน้า

lag(x, n=1) จะส่งคืนค่าจากแถวที่อยู่ก่อนแถวปัจจุบัน n แถว แถวแรก ๆ จะมีค่าเป็น NA เหมาะสำหรับคำนวณการเปลี่ยนแปลงระหว่างช่วงเวลา

library(dplyr)

df <- data.frame(
  month = 1:6,
  revenue = c(100, 120, 95, 140, 160, 130)
)

df %>%
  mutate(
    prev_revenue = lag(revenue),
    change = revenue - lag(revenue),
    pct_change = round(100 * (revenue - lag(revenue)) / lag(revenue), 1)
  )

lead() — ค่าจากแถวถัดไป

lead(x, n=1) จะส่งคืนค่าจากแถวที่อยู่ถัดจากแถวปัจจุบันไป n แถว แถวสุดท้าย ๆ จะมีค่าเป็น NA มีประโยชน์สำหรับคำนวณว่าค่าปัจจุบันเปรียบเทียบกับค่าในอนาคตอย่างไร

library(dplyr)

df <- data.frame(
  month = 1:5,
  revenue = c(100, 120, 95, 140, 160)
)

df %>%
  mutate(
    next_month = lead(revenue),
    next_2_months = lead(revenue, n = 2),
    will_increase = revenue < lead(revenue)
  )

cumsum() และ cumprod()

cumsum(x) คำนวณผลรวมสะสม cumprod(x) คำนวณผลคูณสะสม ทั้งสองเป็นฟังก์ชันพื้นฐานของ R ที่ทำงานร่วมกับ mutate() ได้อย่างราบรื่น

library(dplyr)

df <- data.frame(
  month = 1:6,
  revenue = c(100, 120, 95, 140, 160, 130)
)

df %>%
  mutate(
    running_total = cumsum(revenue),
    growth_factor = round(cumprod(1 + (revenue - 100) / 100), 3)
  )

cummax() และ cummin()

cummax(x) ติดตามค่าสูงสุดสะสม หรือค่าสูงสุดที่พบจนถึงขณะนั้น cummin(x) ติดตามค่าต่ำสุดสะสม ฟังก์ชันเหล่านี้มีประโยชน์สำหรับติดตามค่าสูงสุดหรือต่ำสุดตลอดช่วงเวลาและวิเคราะห์การลดลงจากจุดสูงสุด

library(dplyr)

df <- data.frame(
  day = 1:7,
  price = c(50, 52, 48, 55, 53, 58, 56)
)

df %>%
  mutate(
    all_time_high = cummax(price),
    all_time_low = cummin(price),
    drawdown_from_high = price - cummax(price)
  )

การจัดอันดับด้วย row_number()

row_number() กำหนดอันดับจำนวนเต็มให้แต่ละแถว เมื่อใช้หลัง group_by() จะจัดอันดับภายในแต่ละกลุ่ม ค่าที่เท่ากันจะได้รับอันดับต่อเนื่องตามลำดับที่ปรากฏ

library(dplyr)

sales <- data.frame(
  region = c('East','East','East','West','West','West'),
  rep = c('Alice','Bob','Carol','Dave','Eve','Frank'),
  revenue = c(200, 150, 180, 120, 190, 160)
)

sales %>%
  group_by(region) %>%
  mutate(rank = row_number(desc(revenue))) %>%
  arrange(region, rank)

ntile() — แบ่งเป็นกลุ่มย่อย

ntile(x, n) แบ่งข้อมูลเป็นกลุ่มย่อยที่มีขนาดใกล้เคียงกันจำนวน n กลุ่ม และส่งคืนหมายเลขกลุ่มย่อย (1 = ค่าต่ำสุด) มีประโยชน์สำหรับสร้างกลุ่มควอร์ไทล์ เดไซล์ หรือเปอร์เซ็นไทล์

library(dplyr)

df <- data.frame(
  customer = paste0('C', 1:10),
  spend = c(50, 200, 75, 300, 125, 450, 25, 175, 100, 350)
)

df %>%
  mutate(
    quartile = ntile(spend, 4),
    decile = ntile(spend, 10)
  ) %>%
  arrange(spend)

percent_rank() — อันดับสัมพัทธ์

percent_rank(x) ส่งคืนอันดับของแต่ละค่าในรูปสัดส่วนระหว่าง 0 ถึง 1 ค่าต่ำสุดจะได้ 0 และค่าสูงสุดจะได้ 1 ฟังก์ชันนี้บอกว่าค่านั้นอยู่ในตำแหน่งใดเมื่อเทียบกับค่าอื่นทั้งหมด

library(dplyr)

df <- data.frame(
  student = c('Alice','Bob','Carol','Dave','Eve'),
  score = c(85, 92, 78, 95, 88)
)

df %>%
  mutate(
    pct_rank = round(percent_rank(score), 3),
    top_pct = round(1 - percent_rank(score), 3)
  ) %>%
  arrange(desc(score))

ฟังก์ชันหน้าต่างในกลุ่ม

ฟังก์ชันหน้าต่างทั้งหมดจะคำนึงถึงกลุ่มเมื่อใช้ร่วมกับ group_by() แต่ละกลุ่มจะมีหน้าต่างอิสระของตนเอง ดังนั้น lag/lead จะไม่ข้ามขอบเขตกลุ่ม cumsum จะเริ่มสะสมใหม่ในแต่ละกลุ่ม และการจัดอันดับจะทำภายในกลุ่ม

library(dplyr)

df <- data.frame(
  product = c('A','A','A','B','B','B'),
  month = c(1,2,3,1,2,3),
  sales = c(100, 120, 110, 200, 180, 220)
)

df %>%
  group_by(product) %>%
  mutate(
    mom_change = sales - lag(sales),
    cumulative = cumsum(sales),
    rank_in_product = row_number(sales)
  )

การรวมฟังก์ชันหน้าต่างหลายรายการ

คุณสามารถเชื่อมฟังก์ชันหน้าต่างหลายรายการไว้ในคำสั่ง mutate() เดียว เพื่อสร้างคอลัมน์สำหรับการวิเคราะห์ที่มีรายละเอียดมากขึ้น วิธีนี้ทำให้กระบวนการทำงานอ่านง่ายและหลีกเลี่ยงการเรียก group_by() ซ้ำ

library(dplyr)

stock <- data.frame(
  date = as.Date(c('2024-01-01','2024-01-02','2024-01-03',
                   '2024-01-04','2024-01-05')),
  close = c(150.2, 152.8, 149.5, 155.1, 157.3)
)

stock %>%
  mutate(
    prev_close = lag(close),
    daily_return = round((close / lag(close) - 1) * 100, 2),
    running_high = cummax(close),
    distance_from_high = round(close - cummax(close), 2)
  )

lag() กับอาร์กิวเมนต์ default

lag(x, n=1, default=NA) รับค่า default เพื่อเติมในตำแหน่ง NA เริ่มต้น วิธีนี้มีประโยชน์เมื่อคุณต้องการค่าฐานที่เป็นตัวเลขแทนค่าที่หายไปในคอลัมน์ที่คำนวณ

library(dplyr)

df <- data.frame(
  week = 1:5,
  visitors = c(500, 620, 480, 700, 650)
)

df %>%
  mutate(
    prev_week = lag(visitors, default = 0),
    growth = visitors - lag(visitors, default = visitors[1])
  )

ตรวจสอบด่วน

ntile(x, 4) จะส่งคืนค่าอะไรสำหรับค่าต่ำสุดใน x

ทบทวน: ฟังก์ชันหน้าต่าง

ประเด็นสำคัญของฟังก์ชันหน้าต่างใน dplyr:

  • lag(x, n) — ค่าที่อยู่ก่อนแถวปัจจุบัน n แถว; lead(x, n) — ค่าที่อยู่ถัดไป n แถว
  • cumsum() — ผลรวมสะสม; cumprod() — ผลคูณสะสม
  • cummax() / cummin() — ค่าสูงสุดสะสม / ค่าต่ำสุดสะสม
  • row_number() — อันดับจำนวนเต็มภายในกลุ่ม
  • ntile(x, n) — แบ่งเป็น n กลุ่มย่อย (1=ต่ำสุด, n=สูงสุด)
  • percent_rank(x) — อันดับแบบเศษส่วนระหว่าง 0 ถึง 1
  • ฟังก์ชันหน้าต่างทั้งหมดจะคำนึงถึงกลุ่มเมื่อใช้ร่วมกับ group_by()
library(dplyr)

# Comprehensive window function example
data.frame(
  region = c('East','East','East','West','West','West'),
  month = c(1,2,3,1,2,3),
  sales = c(100, 130, 120, 200, 190, 210)
) %>%
  group_by(region) %>%
  mutate(
    mom_chg = sales - lag(sales),
    running_total = cumsum(sales),
    rank = row_number(desc(sales))
  ) %>%
  ungroup()
เริ่มต้นได้ฟรี

เรียนรู้ R ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
43
บทเรียน
159

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

บทเรียน “ฟังก์ชันหน้าต่าง: lag, lead, cumsum” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ฟังก์ชันหน้าต่าง: lag, lead, cumsum” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชันหน้าต่าง: lag, lead, cumsum”

คำนวณผลรวมสะสม ค่าเลื่อนตำแหน่ง และค่ารวมสะสมภายในกลุ่ม คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ฟังก์ชันหน้าต่าง: lag, lead, cumsum” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สรุปข้อมูลแบบจัดกลุ่มและ group_by()
  2. ฟังก์ชันหน้าต่าง: lag, lead, cumsum
  3. การเชื่อมหลายตารางใน dplyr
  4. การประเมินแบบเป็นระเบียบ: {{ }} และ .data
← กลับไปที่ R Academy