Tôi có một X data.table mà tôi muốn tạo ra một biến dựa trên 2 biến nhân vậtLàm thế nào để tránh tìm kiếm vector trong data.table
X[, varC :=((VarA =="A" & !is.na(VarA))
| (VarA == "AB" & VarB =="B" & !is.na(VarA) & !is.na(VarB))
)
]
Mã này hoạt động nhưng nó là rất chậm, bởi vì nó hiện vector quét trên 2 biến char. Lưu ý rằng tôi không đặt bảng claim4 của VarA và VarB. Có một cách "đúng" để làm điều này trong data.table?
Cập nhật 1: Tôi không sử dụng setkey cho phép chuyển đổi này vì tôi đã sử dụng setkey (X, Year, ID) cho các biến đổi biến khác. Nếu tôi làm như vậy, tôi cần đặt lại các khóa quay lại Năm, ID sau khi chuyển đổi này.
Cập nhật 2: Tôi đã chuẩn tiếp cận của tôi với cách tiếp cận của Matthew, và ông nhanh hơn nhiều:
test replications elapsed relative user.self sys.self user.child sys.child
2 Matthew 100 3.377 1.000 2.596 0.605 0 0
1 vectorSearch 100 200.437 59.354 76.628 40.260 0 0
Điều nhỏ chỉ được setkey sau đó tái setkey lại là hơi dài dòng :)
Tại sao bạn không đặt khóa? –
Cũng có thể có một số mã không cần thiết ở đó; ví dụ: nếu VarA == "AB" là TRUE, thì nó cũng sẽ luôn là TRUE mà! is.na (VarA), đúng không? –
Xin chào Marc, is.na là bắt buộc. Nếu không, nếu VarA bị thiếu, thì điều kiện VarA == "AB" sẽ trả về NA thay vì 0 vì tôi muốn – AdamNYC