2014-08-29 21 views
9

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)(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

+2

'samp [, lf5: = ifelse (loadfactor5 <0, 0, loadfactor5)]'; tìm kiếm '.SD' trên SO để tìm hiểu nó là gì/does – eddi

+0

Tôi đã có thể sử dụng lệnh này để có được kết quả mong muốn. – Krishnan

+0

@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

Trả lời

17

trả lời được cung cấp bởi eddi và bao gồm ở đây vì lợi ích của sự hoàn chỉnh.

samp[, lf5 := ifelse(loadfactor5 < 0, 0, loadfactor5)]

+1

Tôi đoán câu hỏi của câu hỏi là sử dụng ": =" thay vì "=".Và bạn cũng có thể viết samp [, lf5: = loadfactor5 * (loadfactor> = 0)] – skan

2

Một cách khác (mà tôi thích vì nó, theo ý kiến ​​của tôi, sạch):

samp[, lf5 := 0]; samp[loadfactor5 > 0, lf5 := loadfactor5]; 

tôi sử dụng data.table với một tập dữ liệu với 90M hàng; Tôi liên tục ngạc nhiên về cách data.table nhanh như thế nào là cho các hoạt động như trên.

+0

Tôi có một datatable với 12M hàng và tôi cần phải sửa đổi các lĩnh vực và khi tôi làm dt [, TYPE: = ifelse (is.na (TYPE) == TRUE, "KHÔNG", LOẠI)] phải mất 7 giây là bao lâu dplyr mất. Điều đó có thể được tăng tốc bằng cách nào đó không? – user3022875

Các vấn đề liên quan