web-dev-qa-db-ja.com

data.tableに行を挿入します

データフレームがある場合

_set.seed(12345) 
df=data.frame(a=rnorm(5),b=rnorm(5))
_

たとえば、行を追加できます。

df[6,] =c(5,6)

Data.tableで同等の処理を行うと

_library(data.table)
dt=data.table(df)
dt[6,]=c(5,6)
_

エラーで失敗します。 data.tableに行を挿入する正しい方法は何ですか?

41
Tahnoon Pasha

特定のケースで行を追加する場合、@ Franksの回答を展開するには、次のようにします。

set.seed(12345) 
dt1 <- data.table(a=rnorm(5), b=rnorm(5))

以下は同等です。最初の方が読みやすいが、2番目の方が速いと思う:

microbenchmark(
  rbind(dt1, list(5, 6)),
  rbindlist(list(dt1, list(5, 6)))        
  )

ご覧のとおり:

                             expr     min      lq  median       uq     max
           rbind(dt1, list(5, 6)) 160.516 166.058 175.089 185.1470 457.735
 rbindlist(list(dt1, list(5, 6))) 130.137 134.037 140.605 149.6365 184.326

行を他の場所に挿入したい場合、次のように動作しますが、見た目は良くありません:

rbindlist(list(dt1[1:3, ], list(5, 6), dt1[4:5, ]))

あるいは

rbindlist(list(dt1[1:3, ], as.list(c(5, 6)), dt1[4:5, ]))

与える:

            a          b
1:  0.5855288 -1.8179560
2:  0.7094660  0.6300986
3: -0.1093033 -0.2761841
4:  5.0000000  6.0000000
5: -0.4534972 -0.2841597
6:  0.6058875 -0.9193220

行をインプレースで変更する場合(推奨されるアプローチ)、data.tableのサイズを事前に定義する必要があります。

dt1 <- data.table(a=rnorm(6), b=rnorm(6))
set(dt1, i=6L, j="a", value=5) # refer to column by name
set(dt1, i=6L, j=2L, value=6) # refer to column by number

@Boxuanに感謝します。あなたの提案を考慮してこの回答を修正しました。これは少し速くて読みやすいです。

45
dardisco