5

これは簡単なことのように思えますが、私には理解できません。

>d=data.table(x=1:5,y=11:15,z=letters[1:5])
>d
   x  y z
1: 1 11 a
2: 2 12 b
3: 3 13 c
4: 4 14 d
5: 5 15 e

ここで、3行目は不良データであると判断しました。それらすべてをNAに設定したい。

d[3,]<-NA

警告メッセージ:In [<-.data.table*tmp*、3、、value = NA):列のタイプに一致するように「論理」RHSを「文字」に強制変換しました。最初にターゲット列を「論理」に変更するか(新しい「論理」ベクトル長5(テーブル全体の行)を作成してそれを割り当てる、つまり「置換」列)、またはRHSを「文字」に強制します(例:1L、NA_ [real | integer] _、as。*など)意図を明確にし、スピードを上げます。または、テーブルを作成してそれに固執するときに、列タイプを前もって正しく設定してください。

それでも、それは機能しているようです。

> d
    x  y  z
1:  1 11  a
2:  2 12  b
3: NA NA NA
4:  4 14  d
5:  5 15  e

data.frameに変換すると、それも機能しますが、警告は表示されません。しかし、それから私は逆に変換する必要があり、それは厄介なようです。もっと良い方法はありますか?

4

4 に答える 4

9

参照して設定します。

DT[rownum, (names(DT)) := lapply(.SD, function(x) {  .x <- x[1]; is.na(.x) <- 1L; .x})]

多分

DT[rownum, (names(DT)) := lapply(.SD[1,], function(x) { is.na(x) <- 1L; x})]

これにより、正しい NA タイプが確実に作成されます (因子と日付も同様)。

2 番目のケースは 1 回だけインデックスを作成します。DT に多数の列がある場合、または rownum が行の大きなサブグループを作成する場合、これはわずかに高速になる可能性があります。

あなたもすることができます(ローランドのソリューションの変形ですが、コピーはありません。

DT[rownum, (names(DT)) := .SD[NA]]
于 2013-03-21T20:50:58.627 に答える
7

明示的なNA型を使用します。

d[3,] <- list(NA_integer_, NA_integer_, NA_character_)

別の可能性:

d[3,] <- d[3,lapply(.SD,function(x) x[NA])]
于 2013-03-21T17:44:15.727 に答える
3

を使用するのは?setどうですか?

> d=data.table(x=1:5,y=11:15,z=letters[1:5])
> set(d, 3L, 1:3, NA_character_)
> d
    x  y  z
1:  1 11  a
2:  2 12  b
3: NA NA NA
4:  4 14  d
5:  5 15  e
> str(d)
Classes ‘data.table’ and 'data.frame':  5 obs. of  3 variables:
 $ x: int  1 2 NA 4 5
 $ y: int  11 12 NA 14 15
 $ z: chr  "a" "b" NA "d" ...
 - attr(*, ".internal.selfref")=<externalptr> 

または、単純に:

> d=data.table(x=1:5,y=11:15,z=letters[1:5])
> d[3] <- NA_character_
> str(d)
Classes ‘data.table’ and 'data.frame':  5 obs. of  3 variables:
 $ x: int  1 2 NA 4 5
 $ y: int  11 12 NA 14 15
 $ z: chr  "a" "b" NA "d" ...
 - attr(*, ".internal.selfref")=<externalptr> 

[マシューから]はい、どちらかset()が進むべき道であるか、@mnelの答えは非常にきちんとしています:

DT[rownum, names(DT) := .SD[NA]]

アプローチに強制警告が存在するかどうかについてset、内部コードを次に示します (重要な点を伝えるためにここで変更されています)。それを書いているときは、精度の低下 (からdoubleまでinteger) と、RHS を強制する非効率性を念頭に置いていたようです。

if( (isReal(RHS) && (TYPEOF(targetcol)==INTSXP || isLogical(targetcol))) ||
    (TYPEOF(RHS)==INTSXP && isLogical(targetcol)) ||
    (isString(targetcol))) {
    if (isReal(RHS)) s3="; may have truncated precision"; else s3="";
    warning("Coerced '%s' RHS to '%s' to match the column's type%s. ... <s3> ...
}

assign.c の完全なソースは、 https ://r-forge.r-project.org/scm/viewvc.php/pkg/src/assign.c?view=markup&root=datatable で確認できます。

これを改善するための非常によく似た機能要求があります。

FR#2551 シングルトン := 精度が失われない場合、RHS 強制警告なし

この質問に戻るリンクを追加しました。

一般的に、 wheredata.tableは潜在的な問題や非効率性について警告するのに慎重すぎます。このように、さまざまなタイプの列のセットを設定したい場合は、 with でラップするsuppressWarnings()ことも別の方法です。

于 2013-03-21T17:45:16.270 に答える
0

これが私が今していることです。わかりましたが、まだ少しぎこちないです。

na_datatable_row<-function(dtrow){
  #take a row of data.table and return a row of the same table but 
  #with all values set tp NA
  #DT[rownum,]<-NA works but throws an annoying warning 
  #so instead, do DT[rownum,]<-na_datatable_row(DT[anyrow,]) 
  #this preserves the right types
  row=data.frame(dtrow)
  row[1,]<-NA
  return(data.table(row))
}
于 2013-03-21T17:56:57.997 に答える