Tôi đang cố gắng sử dụng data.table để recode một biến dựa trên các điều kiện nhất định. Tập dữ liệu ban đầu của tôi có khoảng 30 triệu bản ghi và sau khi tạo tất cả biến khoảng 130 biến. Tôi đã sử dụng phương pháp gợi ý ở đây: conditional statements in data.table(M1) và cũng ở đây data.table: Proper way to do create a conditional variable when column names are not known?(M2)Sử dụng câu lệnh có điều kiện trong r data.table
Mục tiêu của tôi là có được tương đương với mã dưới đây nhưng cái gì đó được áp dụng sử dụng data.table
samp$lf5 <- samp$loadfactor5
samp$lf5 <- with(samp, ifelse(loadfactor5 < 0, 0, lf5))
Tôi sẽ thừa nhận rằng tôi không hiểu .SD và .SDCols rất tốt, vì vậy tôi có thể sử dụng sai. Mã và các lỗi từ (M1) và (M2) được đưa ra dưới đây và dataset mẫu là ở đây: http://goo.gl/Jp97Wn
(M1)
samp[,lf5 = if(loadfactor5 <0) 0 else loadfactor5]
Thông báo lỗi
Error in `[.data.table`(samp, , lf5 = if (loadfactor5 < 0) 0 else loadfactor5) :
unused argument (lf5 = if (loadfactor5 < 0) 0 else loadfactor5)
Khi tôi làm điều này:
samp[,list(lf5 = if(loadfactor5 <0) 0 else loadfactor5)]
nó mang lại cho lf5 như một danh sách nhưng không phải là một phần của samp data.table và không thực sự áp dụng điều kiện như lf5 vẫn có giá trị nhỏ hơn 0.
(M2)
Col1 <- "loadfactor5"
Col2 <- "lf5"
setkeyv(samp,Col1)
samp[,(Col2) :=.SD,.SDCols = Col1][Col1<0,(Col2) := .SD, .SDcols = 0]
tôi nhận được lỗi sau
Error in `[.data.table`(samp, , `:=`((Col2), .SD), .SDCols = Col1) :
unused argument (.SDCols = Col1)
Bất kỳ hiểu biết sâu sắc về cách kết thúc này đánh giá cao. Tập dữ liệu của tôi có 30 triệu bản ghi vì vậy tôi hy vọng sẽ sử dụng dữ liệu.table để thực sự giảm thời gian chạy xuống.
Cảm ơn,
Krishnan
'samp [, lf5: = ifelse (loadfactor5 <0, 0, loadfactor5)]'; tìm kiếm '.SD' trên SO để tìm hiểu nó là gì/does – eddi
Tôi đã có thể sử dụng lệnh này để có được kết quả mong muốn. – Krishnan
@Krishnan, bạn có thể tự mình trả lời và chấp nhận nó để Q vẫn được trả lời không? Cảm ơn. – Arun