Tôi nghĩ rằng bạn sẽ thấy rằng 'ifelse' không phải là một hoạt động vectơ (thực sự hoạt động như một vòng lặp), và vì vậy nó là các đơn hàng có cường độ chậm hơn so với véc tơ tương đương. R ưu tiên các hoạt động vectơ, đó là lý do tại sao áp dụng, ánh xạ, một cách dễ dàng là sét nhanh cho các phép tính nhất định.
Tập dữ liệu nhỏ, không phải vấn đề, nhưng nếu bạn có độ dài từ 100k trở lên, bạn có thể đi nấu một bữa tối nướng trước khi kết thúc theo bất kỳ phương pháp nào liên quan đến vòng lặp.
Mã bên dưới sẽ hoạt động.
Đối với vector
minvalue <- 0
X[X < minvalue] <- minvalue
Đối Dataframe hoặc Matrix.
minvalue <- 0
n <- 10 #change to whatever.
columns <- c(1:n)
X[X[,columns] < minvalue,columns] <- minvalue
Một phương pháp nhanh chóng, thông qua chức năng Pmax và Pmin, này mũ mục giữa 0 và 1 và bạn có thể đặt một ma trận hoặc dataframe như là đối số đầu tiên không có vấn đề.
ulbound <- function(v,MAX=1,MIN=0) pmin(MAX,pmax(MIN,v))
Câu hỏi về việc thay thế giá trị âm hoặc bằng 0 là câu hỏi thú vị. Bởi vì rất nhiều mô hình được xây dựng trên cơ sở nhật ký (y), tôi thường thay thế chúng bằng trung điểm giữa giới hạn dưới của bình thường và số không. (Có thể là câu hỏi phụ được đặt ra tốt nhất trên stats.exchange.) –
@Dwin, +1 cho nhận xét đó. Tôi muốn thấy câu hỏi thứ hai, và đó là câu trả lời trên crossvalidated.com –
đó là một nhận xét thú vị - tôi thấy những gì bạn đang nói ... Đối với ngữ cảnh, tôi đang sử dụng các giá trị này trong hồi quy với dữ liệu phòng cấp cứu (nghiên cứu dịch tễ học dân số). Lời giải thích tôi đã đưa ra vì sao thay thế <0.1 bằng 0 là chúng ta không muốn đánh giá quá cao hiệu ứng ... một cái gì đó cần làm với "không thổi phồng"? – mEvans