7

私はdata.tableが初めてで、このクラスに問題があります。data1と の2 つの列を持つテーブル ( ) がCoupleありRatioます。CoupleKeydata.table の です。テーブルの値を変更しようとしています。

次のコードでは、cpleは の既存の値ですCouple。実行すると、コメントに示されている結果が得られます。

data1[cple]$Ratio[1]<-0 # I get more than 50 warnings and it doesn't work
data1$Ratio[1]<-0 # It works perfectly (but it's not the same as the above code)

エラーはキーに関係しているようですが、その意味がわかりません。

以下に例を示します。

>data1<-data.table(Couple=c("a","a","b","b"),Ratio=1:4)
>data1
   Couple Ratio
1:      a     1
2:      a     2
3:      b     3
4:      b     4

>setkey(data1,Couple)

>data1["a"]$Ratio[1]<-2 #doesn't work warning message

WARNING:
#In `[<-.data.table`(`*tmp*`, "a", value = list(Couple = c("a", "a" :
 # Coerced 'double' RHS to 'integer' to match the column's type; may have truncated precision. Either change the target column to 'double' first (by creating a new 'double' vector length 4 (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to 'integer' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please.

>data1$Ratio[1]<-2 #works 
>data1
   Couple Ratio
1:      a     2
2:      a     2
3:      b     3
4:      b     4

したがって、インデックスで要素にアクセスする場合は値を変更できますが、値で値にアクセスする場合は変更できません。これどうやってするの?

4

2 に答える 2

9

ASSIGNが のドーター クラスである場合は$with を使用しないでください。ただし、コピーなしで参照によって更新できるため、はるかに優れています。同様に割り当てようとするたびに、テーブル全体がコピーされます。ビネット、特に updateオペレーターを確認する必要があります。あなたの場合、 `data1[Couple=='a',Ratio:=c(0L,Ratio[-1])] が必要です。data.tabledata.tabledata.frame$data1$Ratio[1]<-2:=

この非常に優れた投稿も読みたいと思うかもしれません。

于 2013-03-22T15:10:12.660 に答える
6

質問の最初の部分から判断すると、実際には次のようなことをしたいと思います。

data1[cple,Ratio:=c(0L,Ratio[-1])]

cpleこれにより、data.tableキーのの値がバイナリ検索され、このサブセットで機能します。整数のゼロは最初の値を除く値と組み合わされRatio、結果のベクトルは参照によってに割り当てられますRatio

于 2013-03-22T16:24:12.087 に答える