Chuyển đến nội dung chính

Cách khắc phục lỗi Non-Numeric Argument to Binary Operator trong R

Lỗi non-numeric argument to binary operator trong R xảy ra khi bạn cố thực hiện phép toán trên dữ liệu không phải số, như chuỗi ký tự hoặc factor.
· 8 phút đọc

Khám phá cùng AI

Bạn có thể đã gặp lỗi này khi lập trình trong R: Error: non-numeric argument to binary operator. Lỗi xảy ra khi thực hiện phép toán trên dữ liệu chứa giá trị không phải số, như chuỗi hoặc ký tự.

Trong bài hướng dẫn này, tôi sẽ chỉ bạn cách xử lý và khắc phục lỗi này. Trước tiên, tôi sẽ đưa ra câu trả lời ngắn gọn, sau đó đi sâu hơn để bạn hiểu rõ vì sao lỗi xảy ra.

Câu trả lời ngắn: Cách khắc phục lỗi Non-Numeric Argument to Binary Operator trong R

Nếu bạn đang cần nhanh, cách khắc phục lỗi non-numeric argument to binary operator trong R là chuyển dữ liệu sang kiểu số trước khi thực hiện các phép toán. Cách này đảm bảo mọi phần tử trong dữ liệu đều phù hợp cho tính toán.

Trong ví dụ sau, hàm as.numeric() chuyển trực tiếp vector characters sang số, đảm bảo phép cộng được thực hiện mà không gặp lỗi.

characters <- c("5", "10", "15")

characters <- as.numeric(characters)

result <- characters + 10

print(result)

Vì sao lỗi xảy ra

Trong R, các phép toán được thiết kế để làm việc với kiểu dữ liệu số. Khi bạn gặp lỗi non-numeric argument to binary operator, thường là do sử dụng sai toán tử với dữ liệu không phải số, như chuỗi hoặc factor. Để tìm hiểu thêm về kiểu dữ liệu trong R, hãy đọc hướng dẫn Data Types in R.

Điều này có thể xảy ra trong một số tình huống phổ biến:

  • Thực hiện phép toán trên chuỗi ký tự: Lỗi xảy ra khi cố thực hiện phép toán trên dữ liệu văn bản.
  • Thực hiện phép toán trên kiểu dữ liệu factor: Lỗi xảy ra khi R chuyển chuỗi thành factor trong data frame, đặc biệt khi nhập dữ liệu, dẫn đến kiểu không phải số ngoài ý muốn.
  • Thực hiện phép toán trên list hoặc cấu trúc phức tạp khác: Lỗi cũng xảy ra khi dùng toán tử số học cho list hoặc các cấu trúc tương tự không phù hợp cho việc này.

Cách tái hiện và khắc phục lỗi

Hãy tạo một tập dữ liệu đơn giản và thực hiện các thao tác cố tình gây lỗi để minh họa cách lỗi xuất hiện. Sau đó, chúng ta sẽ khắc phục từng trường hợp.

Cách tái hiện và khắc phục lỗi với chuỗi ký tự

Trong ví dụ đầu tiên, chúng ta thấy thông báo lỗi vì các phần tử của vector characters không phải kiểu số mà là chuỗi ký tự.

characters <- c("5", "10", "15")

result <- characters + 10

print(result)

Để khắc phục, chúng ta chuyển sang số bằng as.numeric():

characters <- c("5", "10", "15")

characters <- as.numeric(characters)

result <- characters + 10

print(result)

Cách tái hiện và khắc phục lỗi với factor

Trong ví dụ tiếp theo, chúng ta sẽ tái hiện lỗi với factor.

factors <- factor(c("5", "10", "15"))

result <- factors + 10

print(result)

Để khắc phục, chúng ta chuyển sang số bằng cách trước hết chuyển sang chuỗi. Lý do là trong R, factor được lưu trữ như vector số nguyên với một tập mức (level) là chuỗi ký tự tương ứng.

Khi bạn chuyển trực tiếp factor sang số bằng as.numeric(), R sẽ trả về mã số nguyên bên dưới, tức biểu diễn nội bộ của level factor, thay vì giá trị chuỗi thực tế. Chuyển factor sang chuỗi trước sẽ lấy được level thực dưới dạng chuỗi, sau đó mới chuyển đúng sang số.

factors <- factor(c("5", "10", "15"))

factors <- as.numeric(as.character(factors))

result <- factors + 10

print(result)

Cách tái hiện và khắc phục lỗi với list

Trong ví dụ tiếp theo, chúng ta sẽ tái hiện lỗi với list. 

list_data <- list("5", "10", "15")

result <- list_data + 10

print(result)

Để khắc phục, chúng ta trích xuất và chuyển các phần tử sang số. Hàm unlist() chuyển list thành vector. 

list_data <- list("5", "10", "15")

list_data <- as.numeric(unlist(list_data))

result <- list_data + 10

print(result)

Cách tái hiện và khắc phục lỗi với dữ liệu kiểu hỗn hợp

Ví dụ sau phức tạp hơn một chút. Các kỹ thuật trước đó sẽ không hiệu quả vì chúng ta sẽ gặp "20a", giá trị này không thể chuyển sang số. 

Hàm sapply() là một cách xử lý tốt trong trường hợp này. Hàm sẽ áp dụng một hàm được chỉ định cho từng phần tử của vector. Ở đây, chúng ta định nghĩa một hàm cố gắng chuyển từng phần tử sang giá trị số.

mixed_data <- list("5", 10, "15", "20a")

numeric_data <- sapply(mixed_data, function(x) {
  if (is.numeric(x)) {
    return(x)
  } else if (!is.na(as.numeric(x))) {
    return(as.numeric(x))
  } else {
    return(NA)
  }
})

result <- numeric_data + 10

print(result)

Để tìm hiểu thêm về lập trình hàm trong R, hãy xem khóa học Intermediate Functional Programming with purrr. Để biết thêm về họ hàm apply(), hãy đọc Tutorial on the R Apply Family. 

Những điều bổ sung cần biết

Gỡ lỗi với traceback

Khi xảy ra lỗi, traceback() là công cụ hữu ích để gỡ lỗi. Nó cung cấp chuỗi lời gọi dẫn đến lỗi, giúp bạn xác định chính xác điểm xảy ra sự cố.

traceback()

Sau khi chạy lệnh này, R sẽ in ra chuỗi các lời gọi hàm dẫn đến lỗi. Điều này giúp bạn biết dữ liệu không phải số có thể đã được đưa vào từ đâu.

Rà soát phương thức nhập dữ liệu

Bạn cũng nên kiểm tra lại cách nhập dữ liệu và đảm bảo chuyển đổi đúng. Khi nhập dữ liệu, đặc biệt từ tệp CSV, R có thể tự động chuyển dữ liệu ký tự thành factor. Cần kiểm soát hành vi này để dữ liệu được nhập chính xác.

# Giả sử dữ liệu được đọc từ CSV và bị nhập sai thành factor
data <- read.csv("data.csv", stringsAsFactors = TRUE)

data$column <- as.numeric(as.character(data$column))

Trong ví dụ này, dữ liệu được nhập từ tệp CSV với stringsAsFactors bật TRUE. Sau đó, chúng ta chuyển cột factor sang chuỗi rồi sang số để đảm bảo kiểu dữ liệu phù hợp cho các phép toán.

Cách phòng tránh lỗi

Sử dụng kiểm tra điều kiện

Để phòng tránh lỗi này, hãy triển khai các kiểm tra điều kiện nhằm đảm bảo kiểu dữ liệu phù hợp trước khi thao tác. Việc kiểm tra kiểu và xử lý chuyển đổi khi cần là thực hành tốt trước khi thực hiện phép toán.

Trong ví dụ sau, chúng ta kiểm tra dữ liệu có phải số không. Nếu không, chuyển sang số trước khi tiếp tục phép toán. Cách này bắt các kiểu dữ liệu sai và chuyển đổi phù hợp sang kiểu số. 

data <- "20"

if(is.numeric(data)) {
  result <- data + 10
} else {
  data <- as.numeric(data)
  result <- data + 10
}

print(result)

ví dụ kiểm tra điều kiện

Kết luận và tài nguyên bổ sung

Hy vọng bài viết này hữu ích để giải quyết vấn đề của bạn. Những lỗi như non-numeric argument to binary operator rất phổ biến trong lập trình, và biết cách xử lý là điều quan trọng. Hiểu về kiểu dữ liệu và chuyển đổi đúng cách sẽ giúp bạn tránh gặp lỗi này.

Để hỗ trợ bạn với R, hãy xem các cheat sheet về R hoặc khóa học miễn phí Introduction to R, hoặc để hiểu sâu hơn, hãy thử R Programming Skill Track.

Austin Chia

Tác giả

Austin Chia

Tôi là Austin, một blogger và cây bút công nghệ với nhiều năm kinh nghiệm làm nhà khoa học dữ liệu và nhà phân tích dữ liệu trong lĩnh vực chăm sóc sức khỏe. Khởi đầu hành trình công nghệ với nền tảng sinh học, tôi hiện hỗ trợ những người khác thực hiện chuyển đổi tương tự thông qua blog công nghệ của mình. Niềm đam mê công nghệ đã đưa tôi đến với việc cộng tác viết cho hàng chục công ty SaaS, truyền cảm hứng cho người khác và chia sẻ trải nghiệm của bản thân.

Câu hỏi thường gặp

Đối số không phải số là gì?

Đối số không phải số là một giá trị hoặc biến không thể được hiểu là số trong ngôn ngữ lập trình như R.

Làm sao tôi phát hiện lỗi này trong mã?

Thông báo lỗi thường bao gồm cụm từ "non-numeric argument", giúp bạn dễ dàng nhận diện.

Lỗi này chỉ xảy ra trong R thôi sao?

Không, lỗi này cũng có thể xảy ra trong các ngôn ngữ lập trình khác. Tuy nhiên, thông báo lỗi có thể xuất hiện dưới dạng khác.

Có cách nào tránh hoàn toàn lỗi này không?

Có, bằng cách đảm bảo tất cả giá trị và biến trong mã của bạn tương thích với toán tử cụ thể đang dùng.

Tôi có thể dùng bất kỳ loại toán tử nào với đối số không phải số không?

Không, một số toán tử chỉ dùng được với giá trị số và sẽ gây lỗi này nếu nhận đối số không phải số.

Chủ đề

Liên quan