2013-05-20 3 views
34

Если у меня есть кадр данныхВставка строки в 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) 

Это терпит неудачу с ошибкой. Каков правильный способ вставки строки в таблицу данных?

+2

Я думаю, что для этого пакета планируется создать функцию 'insert()', чтобы сделать ее относительно быстрой для добавления строк, но на данный момент вы должны предварительно распределить «таблицу» таблицы данных. Возможно, это: http://r-forge.r-project.org/tracker/index.php?func=detail&aid=1458&group_id=240&atid=978 – Frank

+8

Является ли 'rbind (dt, list (5,6))' достаточным для вас цель? – Roland

+2

btw ime каждый раз, когда я думал, что мне нужно добавить данные подряд за строкой, я думал о стиле C, а не в стиле R, поэтому, помимо вышеуказанных комментариев, вы должны пересмотреть, действительно ли вам нужно это делать. – eddi

ответ

36

Для расширения @Franks ответа, если в вашем конкретном случае, вы добавив строку, это:

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

Ниже эквивалентны; Я нахожу, что первые легче читать, но второй быстрее:

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, я изменил этот ответ, чтобы учесть ваше предложение, которое немного быстрее и легче читать.

+1

Почему бы не использовать 'rbindlist (list (dt1, list (5,6)))' как ваш второй вариант для немного лучшей читаемости? – Boxuan

+1

@Boxuan 'rbindlist (list (dt1, list (c (5, 6))))' дает мне ошибку ... Пункт 2 имеет 1 столбец, несовместимый с пунктом 1, который имеет 2 столбца ... 'См. Вывод из 'list (c (5, 6))', который представляет собой список с одним элементом vs. 'as.list (c (5, 6)), который имеет два. – dardisco

+0

Это странно. Я могу запустить его на своей машине. Может быть, у нас разные версии? 'packageVersion (" data.table ")' дает мне '[1] '1.9.4'' и' getRversion() 'дает мне' [1]' 3.2.0''. – Boxuan

Смежные вопросы