2017-03-17 4 views
0

データセットの選択されたグループの列に対して新しいラベル付きの表示列を作成する関数を作成しようとしています。2つのベクトルをループする列を作成する

# Data Set 
A = as.factor(c(0,2,1,0)) 
B = as.factor(c(2,NA,1,0)) 
C = as.factor(c(1,0,NA,0)) 
D = as.factor(c(NA,2,0,1)) 
dat = data.table(A, B, C, D) 

現在、私は私がしたい各列のためにこれをやっている:

# What I'm currently doing (expected output of loop matches these columns) 
attach(dat) 
     VAR = B 
     dat$b.test[VAR == "0"] <- "0" 
     dat$b.test[VAR == "1" | VAR == "2"] <- "1" 

     VAR = C 
     dat$c.test[VAR == "0"] <- "0" 
     dat$c.test[VAR == "1" | VAR == "2"] <- "1" 

     VAR = D 
     dat$d.test[VAR == "0"] <- "0" 
     dat$d.test[VAR == "1" | VAR == "2"] <- "1" 
detach(dat) 

私はすべての列を含むベクトル上で実行されるループのために作成することができるはずですように思えます私はロジックが(B、C、D)で実行され、各ベクトル内の同じ位置にある別のベクトル(b2、c2、d2)から新しい名前を呼び出すようにします。新しい列Xで

試み方法1つの

# Failed method 1 
attach(dat) 
     new.var = c(b2, c2, d2) 
     cur.var = c(B, C, D) 
     l = length(cur.var) 

     for(i in 1:l){ 
       X = cur.var[i] 
       VAR = cur.var[i] 
       dat$X[VAR == "0"] <- "0" 
       dat$X[VAR == "1" | VAR == "2"] <- "1" 
     } 
detach(dat) 

結果

試み方法2

# Failed method 2 
     new.var = c(dat$b2, dat$c2, dat$d2) 
     cur.var = c(dat$B, dat$C, dat$D) 
     l = length(cur.var) 
for(i in 1:l){ 
     new.var[i] = ifelse(new.var[i] == "0", "0", 
          ifelse(new.var[i] == "1" | "2", "1", NA) 
          ) 
} 

試してみて、これを行うためのさまざまな方法がありますか?

+1

ようこそ。 dfに希望の出力を提供してください。 –

答えて

1

本当にループは必要ありません。 .SD変数を使用して列に対して反復処理を行うことができます。例えば、

change<-c("B","C","D") 

myfun <- function(x) ifelse(x==0, "0", "1") 
dat[,paste0(change,".test") := Map(myfun, .SD), .SDcols=change] 

# A B C D B.test C.test D.test 
# 1: 0 2 1 NA  1  1  NA 
# 2: 2 NA 0 2  NA  0  1 
# 3: 1 1 NA 0  1  NA  0 
# 4: 0 0 0 1  0  0  1 
+0

彼らの例ではOPに 'data.table'がありました。どこで 'as.character(as.interger(x))'を使うのですか? 2はサンプルコードでも1になるはずです。 – MrFlick

関連する問題