Подтвердить что ты не робот

Объединение таблиц данных, таких как кадры данных в R

Из-за ограничений по времени я решил использовать таблицы данных в своем коде вместо фреймов данных, так как они намного быстрее. Тем не менее, мне по-прежнему нужна функциональность фреймов данных. Мне нужно объединить две таблицы данных, сохраняя все значения (например, задание all = TRUE в слиянии).

Пример кода:

> x1 = data.frame(index = 1:10)
> y1 = data.frame(index = c(2,4,6), weight = c(.2, .5, .3))
> x1
   index
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      9
10    10
> y1
  index weight
1     2    0.2
2     4    0.5
3     6    0.3

> merge(x,y, all=TRUE)
      index weight
 [1,]     1     NA
 [2,]     2      1
 [3,]     3     NA
 [4,]     4      2
 [5,]     5     NA
 [6,]     6      3
 [7,]     7     NA
 [8,]     8     NA
 [9,]     9     NA
[10,]    10     NA

Теперь я могу сделать подобное с таблицами данных? (NA не обязательно должен оставаться, я все равно меняю на 0).

> x2 = data.table(index = 1:10, key ="index")
> y2 = data.table(index = c(2,4,6), weight= c(.3,.5,.2))

Я знаю, что вы можете объединиться, но я также знаю, что есть более быстрый способ.

4b9b3361

Ответ 2

Я использую такую ​​функцию, как:

mergefast<-function(x,y,by.x,by.y,all) {
  x_dt<-data.table(x)
  y2<-y
  for (i in 1:length(by.y)) names(y2)[grep(by.y[i],names(y2))]<-by.x[i]
  y_dt<-data.table(y2)
  setkeyv(x_dt,by.x)
  setkeyv(y_dt,by.x)
  as.data.frame(merge(x_dt,y_dt,by=by.x,all=all))
}

который можно использовать в вашем примере как:

mergefast(x1,y1,by.x="index",by.y="index",all=T)

Немного недостает функций, которые merge имеет, например. by, all.x, all.y, но их можно легко включить.