2017-05-18 8 views
1

私はtd.br.2と呼ばれるdata.tableを持っていますが、一部の列は NAsです。これらの列のタイプはnumericです。私がしたいのは、のみで、これらの列を要素に変換することです。数値から因子へのすべての列を変換する

は、私は次のことを試してみましたが、それは動作しません(私はエラーを取得しないが、それはどちらかの仕事をしていません)

td.br.2[] <- td.br.2[,lapply(.SD, function(x) {ifelse(sum(is.na(x)==nrow(td.br.2)),as.factor(x),x)})] 
+1

'ifelse'は最初の引数の各要素にチェックを適用します。ベクトル化された式の比較に使用するように設計されています。 'if..else'は一つの式をチェックします。あなたのアプリケーションは、2番目のケースに適用されます。 – lmo

+0

@lmo何が分かったのか分かりませんでした。非常に有用な情報。ありがとう! – quant

答えて

1
n=10#nr of rows 
m=10#nr of cols 
N<-n*m 
m1<-matrix(runif(N),nrow=n,ncol = m) 
dt<-data.table(m1) 
names(dt)<-letters[1:m] 
dt<-cbind(dt,xxx=rep(NA,nrow(dt)))#adding NA column 

str(dt) 
Classes ‘data.table’ and 'data.frame': 10 obs. of 11 variables: 
$ a : num 0.661 0.864 0.152 0.342 0.989 ... 
$ b : num 0.06036 0.67587 0.00847 0.37674 0.30417 ... 
$ c : num 0.3938 0.6274 0.0514 0.882 0.1568 ... 
$ d : num 0.777 0.233 0.619 0.117 0.132 ... 
$ e : num 0.655 0.926 0.277 0.598 0.237 ... 
$ f : num 0.649 0.197 0.547 0.585 0.685 ... 
$ g : num 0.6877 0.3676 0.009 0.6975 0.0327 ... 
$ h : num 0.519 0.705 0.457 0.465 0.966 ... 
$ i : num 0.43777 0.00961 0.30224 0.58172 0.37621 ... 
$ j : num 0.44 0.481 0.485 0.125 0.263 ... 
$ xxx: logi NA NA NA NA NA NA ... 

そこで実行して:

dt<-dt[, lapply(.SD, function(x){ if(all(is.na(x)))as.factor(as.character(x)) else x}),] 

収率:

str(dt) 
Classes ‘data.table’ and 'data.frame': 10 obs. of 11 variables: 
$ a : num 0.0903 0.0448 0.5956 0.418 0.1316 ... 
$ b : num 0.672 0.582 0.687 0.113 0.371 ... 
$ c : num 0.404 0.16 0.848 0.863 0.737 ... 
$ d : num 0.073 0.129 0.243 0.334 0.285 ... 
$ e : num 0.485 0.186 0.539 0.486 0.784 ... 
$ f : num 0.4685 0.4815 0.585 0.3596 0.0764 ... 
$ g : num 0.958 0.194 0.549 0.71 0.737 ... 
$ h : num 0.168 0.355 0.552 0.765 0.605 ... 
$ i : num 0.665 0.88 0.23 0.575 0.413 ... 
$ j : num 0.1113 0.8797 0.1244 0.0741 0.8724 ... 
$ xxx: Factor w/ 0 levels: NA NA NA NA NA NA NA NA NA NA 
+0

ありがとうございます。しかし、私は 'ifelse'でそれがうまくいかない理由を理解できませんが、' if ... else'が動作します。それとも、もし 'if'の中の条件だったのでしょうか? – quant

1

私はあなたがそれをしたいと思う理由はわかりません、しかし、あなたはここにいます:

naColumns <- sapply(td.br.2, function(x) { all(is.na(x)) }) 
for (col in which(naColumns)) 
    set(td.br.2, j=col, value=as.factor(x[[col]])) 

これらの要素にはレベルはありませんが、必要に応じて対処できます。

は(ループの一部 thisに基づいている。)この時点で

+0

次のエラーが表示されます。[< - 。data.table'( '* tmp *'、、naColumns、value = NA_integer_):jは列名または位置のベクトルでなければならない ' – quant

+0

残念です。私が書いたのは 'data.frame'でした。私は 'data.table'で動作するように修正しました。 – user1310503

関連する問題