2012-12-02 41 views
5

Tôi muốn thực hiện một vòng lặp đơn giản bằng cách sử dụng data.table. Tôi có 20 nhị phân (0,1) biến (từ VAR_1 để var_20) và tôi muốn làm một vòng cho việc này:một vòng lặp đơn giản với data.table

dat[var_1==1, newvar:=1] 
dat[var_2==1, newvar:=2] 
dat[var_3==1, newvar:=3] 
... 
dat[var_20==1, newvar:=21] 

vấn đề chính của tôi là tôi không biết làm thế nào xác định i (tức là VAR_1 = = 1, var_2 == 2 ...) sử dụng vòng lặp. Dưới đây là một ví dụ ngắn:

var_1 <- c(1, rep(0,9)) 
var_2 <- c(0,1, rep(0,8)) 
var_3 <- c(0,0,1, rep(0,7)) 
dat <- data.table(var_1, var_2, var_3) 

dat[var_1==1, newvar:=1] 
dat[var_2==1, newvar:=2] 
dat[var_3==1, newvar:=3] 

Bất kỳ ý tưởng nào về cách thực hiện điều này bằng vòng lặp? Cảm ơn!

Trả lời

4

Để tận dụng lợi thế của lớp dữ liệu, tốt hơn nên đặt khóa.

dat[ ,newvar:= NA_integer_] 
for(i in ncol(dat)) { 
setkeyv(dat, names(dat)[i]) 
dat[J(1), newvar:=i] 
} 
+0

Cảm ơn bạn. Bạn có biết cách làm điều đó newvar: = 1L tăng từ 1 đến số biến (ví dụ: newvar phải bằng 2 cho var_2, 3 cho var_3, v.v.). Cũng có thể một số biến có giá trị 1 đồng thời, trong trường hợp đó, tôi muốn chỉ tính giá trị lớn hơn (ví dụ: trường hợp có var_1 = 1 và var_3 = 1, tôi muốn nhận newvar = 3). – sdaza

+0

Đoạn mã trên nên thực hiện việc này. Tôi sẽ được quan tâm đến hiệu suất của các phím thiết lập nhiều lần so với quét tuần tự nhưng đơn quét trên data.tables lớn – mnel

+0

@WojciechSobala Thông thường nó là tốt hơn để setkey nhưng setkey phải đọc mọi giá trị trong cột (quét) trong quá trình phân loại nó. Vì vậy, trong trường hợp đặc biệt của một lần quét đơn lẻ cho một giá trị duy nhất trên một cột đơn lẻ, việc quét vectơ phải nhanh hơn khóa setkey + join. Mặc dù vậy, tôi vẫn chưa thử nghiệm bản thân mình. –

4

Điều gì đó như thế này sẽ hoạt động.

nams <- names(dat) 
for(n in seq_along(nams)){ 
    nam <- nams[n] 
    char <- sprintf('%s==1',nam) 
    dat[eval(parse(text=char)), newvar := n] 
} 
dat 
var_1 var_2 var_3 newvar 
1:  1  0  0  1 
2:  0  1  0  2 
3:  0  0  1  3 
4:  0  0  0  NA 
5:  0  0  0  NA 
6:  0  0  0  NA 
7:  0  0  0  NA 
8:  0  0  0  NA 
9:  0  0  0  NA 
10: 0  0  0  NA 
+0

Đã hoạt động! Cảm ơn! – sdaza

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