0Pricing
R Academy · บทเรียน

การแปลงระหว่างชนิดข้อมูลตัวเลข

ใช้ as.integer(), as.double() และ as.numeric() อย่างปลอดภัย

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

Integer เทียบกับ Double ใน R

R มีชนิดข้อมูลตัวเลขสองชนิด: integer (จำนวนเต็ม สร้างด้วยส่วนต่อท้าย L) และ double (เลขทศนิยม ซึ่งเป็นค่าเริ่มต้นสำหรับค่าตัวเลขที่เขียนโดยตรง) โดยส่วนใหญ่ R จะใช้ double แต่การแยกความแตกต่างระหว่างสองชนิดนี้มีความสำคัญต่อความปลอดภัยของชนิดข้อมูลและประสิทธิภาพการใช้หน่วยความจำ

x_dbl <- 5        # double by default
x_int <- 5L       # integer (L suffix)

cat('typeof(5):  ', typeof(x_dbl), '
')  # double
cat('typeof(5L): ', typeof(x_int), '
')  # integer
cat('5 == 5L:    ', x_dbl == x_int, '
') # TRUE (values equal)
cat('identical:  ', identical(x_dbl, x_int), '
')  # FALSE (types differ)

as.integer() — แปลงเป็น Integer

as.integer(x) แปลงค่าเป็นจำนวนเต็มโดย ตัดทิ้ง ส่วนทศนิยม (ไม่ใช่การปัดเศษ) ดังนั้น 3.9 จะกลายเป็น 3 ไม่ใช่ 4 ส่วนต่อท้าย L เป็นรูปแบบย่อทางไวยากรณ์สำหรับค่าจำนวนเต็มที่เขียนโดยตรง

cat('as.integer(3.7):  ', as.integer(3.7), '
')   # 3 (truncated, not 4)
cat('as.integer(3.2):  ', as.integer(3.2), '
')   # 3
cat('as.integer(-2.9): ', as.integer(-2.9), '
')  # -2 (toward zero)
cat('as.integer(10.9): ', as.integer(10.9), '
')  # 10

# Compare with round
cat('round(3.7):        ', round(3.7), '
')       # 4

as.double() และ as.numeric()

as.double(x) และ as.numeric(x) ให้ผลเหมือนกัน — ทั้งคู่แปลงค่าเป็น double (เลขทศนิยม) ใช้ฟังก์ชันเหล่านี้แปลงจำนวนเต็มเป็น double เมื่อต้องการความละเอียดของค่าที่เป็นเศษส่วน

count <- 7L  # integer
cat('typeof(count):         ', typeof(count), '
')

dbl_count <- as.double(count)
cat('typeof(as.double(7L)): ', typeof(dbl_count), '
')  # double
cat('Value:                 ', dbl_count, '
')           # 7

# Division automatically promotes to double
cat('7L / 2L:              ', 7L / 2L, '
')            # 3.5 (double)
cat('typeof(7L / 2L):      ', typeof(7L / 2L), '
')    # double

การคำนวณเลขจำนวนเต็ม

การคำนวณจำนวนเต็มใน R ให้ผลเป็นจำนวนเต็มสำหรับ +, - และ * แต่จะคืนค่าเป็น double เสมอสำหรับ / เรื่องนี้อาจทำให้แปลกใจหากคุณคาดว่าการหารจำนวนเต็มจะยังคงให้ผลเป็นจำนวนเต็ม

a <- 6L
b <- 3L

cat('6L + 3L =', a + b, '| typeof:', typeof(a + b), '
')  # 9 integer
cat('6L - 3L =', a - b, '| typeof:', typeof(a - b), '
')  # 3 integer
cat('6L * 3L =', a * b, '| typeof:', typeof(a * b), '
')  # 18 integer
cat('6L / 3L =', a / b, '| typeof:', typeof(a / b), '
')  # 2 DOUBLE!
cat('6L %/% 3L =', a %/% b, '| typeof:', typeof(a %/% b), '
') # 2 integer

การตัดทิ้งเทียบกับการปัดเศษ

ความแตกต่างที่สำคัญคือ as.integer() จะ ตัดทิ้ง (ลบทศนิยมออก) ขณะที่ round() จะปัดเป็นจำนวนเต็มที่ใกล้ที่สุด โปรดระบุให้ชัดเจนเสมอว่าต้องการพฤติกรรมแบบใด

values <- c(2.1, 2.5, 2.9, -2.1, -2.5, -2.9)

cat('Original:     ', values, '
')
cat('as.integer():  ', as.integer(values), '
')  # truncate toward 0
cat('round():       ', round(values), '
')       # banker rounding
cat('floor():       ', floor(values), '
')       # round down
cat('ceiling():     ', ceiling(values), '
')     # round up

ความเสี่ยงจำนวนเต็มล้น

จำนวนเต็มใน R มีขนาด 32 บิต และเก็บค่าได้สูงสุดประมาณ ±2.1 พันล้าน หากเกินช่วงนี้จะทำให้เกิด NA พร้อมคำเตือน ส่วน double สามารถเก็บค่าที่ใหญ่กว่านี้มากได้ (สูงสุดประมาณ 1.8 × 10^308)

max_int <- .Machine$integer.max
cat('Max integer:', max_int, '
')  # 2147483647

# Overflow produces NA
cat('max_int + 1L:', max_int + 1L, '
')  # NA with warning

# Double handles it fine
cat('as.double(max_int) + 1:', as.double(max_int) + 1, '
')  # 2147483648

ส่วนต่อท้าย L ในเวกเตอร์

คุณสามารถสร้างเวกเตอร์จำนวนเต็มโดยใช้ส่วนต่อท้าย L กับสมาชิกแต่ละตัว หรือส่งลำดับผ่าน as.integer() ตัวดำเนินการโคลอน : จะสร้างจำนวนเต็มโดยอัตโนมัติ

# Colon produces integers
seq_int <- 1:5
cat('1:5 typeof:', typeof(seq_int), '
')  # integer

# Explicit integer vector
vec_int <- c(10L, 20L, 30L, 40L)
cat('c(10L,...) typeof:', typeof(vec_int), '
')  # integer

# as.integer on a vector
vec_dbl <- c(1.1, 2.9, 3.5, 4.7)
cat('as.integer(c(1.1,...)):', as.integer(vec_dbl), '
')  # 1 2 3 4

หน่วยความจำและประสิทธิภาพ

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

n <- 1000000L

vec_int <- 1:n          # integer: 4 bytes each
vec_dbl <- as.double(1:n)  # double: 8 bytes each

cat('Integer vector size:', object.size(vec_int), 'bytes
')
cat('Double vector size: ', object.size(vec_dbl), 'bytes
')
cat('Ratio:', as.numeric(object.size(vec_dbl)) / as.numeric(object.size(vec_int)), '
')

การตรวจสอบการจัดเก็บแบบจำนวนเต็มด้วย is.integer()

ใช้ is.integer() เสมอ (ไม่ใช่ is.numeric()) เมื่อต้องการตรวจสอบโดยเฉพาะว่าจัดเก็บเป็นจำนวนเต็ม ตัวเลขที่ไม่มีส่วนต่อท้าย L จะเป็น double แม้จะดูเหมือนจำนวนเต็มก็ตาม

a <- 5    # looks like integer, but it is double
b <- 5L   # true integer

cat('is.integer(5):  ', is.integer(a), '
')   # FALSE!
cat('is.integer(5L): ', is.integer(b), '
')   # TRUE
cat('is.numeric(5):  ', is.numeric(a), '
')   # TRUE
cat('is.numeric(5L): ', is.numeric(b), '
')   # TRUE
cat('class(5):       ', class(a), '
')        # numeric
cat('class(5L):      ', class(b), '
')        # integer

ตัวอย่างกระบวนการแปลง

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

# Simulated: reading counts as doubles (common from CSV)
counts_raw <- c(12.0, 8.0, 15.0, 3.0, 22.0)
cat('typeof raw:', typeof(counts_raw), '
')  # double

# Convert to integer for proper storage
counts_int <- as.integer(counts_raw)
cat('typeof converted:', typeof(counts_int), '
')  # integer
cat('Counts:', counts_int, '
')
cat('Total:', sum(counts_int), '
')

สรุปการแปลงค่าตัวเลข

ฟังก์ชันการแปลงที่สำคัญสำหรับชนิดข้อมูลตัวเลขมีดังนี้:

  • as.integer(x) — ตัดทิ้งให้เป็นจำนวนเต็ม (ลบทศนิยม โดยเคลื่อนเข้าหาศูนย์)
  • as.double(x) / as.numeric(x) — แปลงเป็น double
  • round(x) — ปัดเป็นค่าที่ใกล้ที่สุด (ใช้กับค่าที่ต้องการให้มีลักษณะเป็นจำนวนเต็ม)
  • floor(x) / ceiling(x) — ปัดลง / ปัดขึ้น
  • ไวยากรณ์ 5L — ค่าจำนวนเต็มที่เขียนโดยตรง (ไม่ต้องแปลง)
  • 1:n — สร้างจำนวนเต็มเสมอ
x <- 7.8
cat('as.integer(7.8):', as.integer(x), '
')  # 7 (truncate)
cat('round(7.8):     ', round(x), '
')       # 8
cat('floor(7.8):     ', floor(x), '
')       # 7
cat('ceiling(7.8):   ', ceiling(x), '
')     # 8

ตรวจสอบอย่างรวดเร็ว

as.integer(3.9) คืนค่าอะไรใน R

ทบทวน: การแปลงชนิดข้อมูลตัวเลข

ยอดเยี่ยมครับ/ค่ะ! ประเด็นสำคัญจากบทเรียนนี้มีดังนี้:

  • R มีชนิดข้อมูลตัวเลขสองชนิด: integer (ส่วนต่อท้าย L, 4 ไบต์) และ double (ค่าเริ่มต้น, 8 ไบต์)
  • as.integer(x) จะ ตัดทิ้ง เข้าหาศูนย์ — ไม่ใช่การปัดเศษ
  • as.double() และ as.numeric() เหมือนกัน — ทั้งคู่แปลงเป็น double
  • / จะคืนค่าเป็น double เสมอ แม้ตัวถูกดำเนินการจะเป็นจำนวนเต็ม
  • 1:n สร้างลำดับจำนวนเต็ม ส่วนค่าตัวเลขที่ไม่มี L จะเป็น double
  • จำนวนเต็มจะล้นที่ประมาณ 2.1 พันล้าน → ใช้ double สำหรับจำนวนเต็มที่มีค่ามากมาก
# Demonstrate truncation vs rounding
test_vals <- c(0.1, 0.5, 0.9, 1.5, 2.5, 3.7)
cat('Values:      ', test_vals, '
')
cat('as.integer(): ', as.integer(test_vals), '
')  # truncation
cat('round():      ', round(test_vals), '
')       # nearest (banker)

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

บทเรียน “การแปลงระหว่างชนิดข้อมูลตัวเลข” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การแปลงระหว่างชนิดข้อมูลตัวเลข”

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

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

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

บทเรียน “การแปลงระหว่างชนิดข้อมูลตัวเลข” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ภาพรวมระบบชนิดข้อมูลของ R
  2. การแปลงระหว่างชนิดข้อมูลตัวเลข
  3. การแปลงชนิดตรรกะและอักขระ
  4. ข้อควรระวังและแนวทางปฏิบัติที่ดีในการบังคับชนิดข้อมูล
← กลับไปที่ R Academy