Как заменить определенное значение в одном data.table на значения другого data.table того же измерения - PullRequest
0 голосов
/ 07 мая 2018

Учитывая два data.table:

dt1 <- data.table(id = c(1,-99,2,2,-99), a = c(2,1,-99,-99,3), b = c(5,3,3,2,5), c = c(-99,-99,-99,2,5))
dt2 <- data.table(id = c(2,3,1,4,3),a = c(6,4,3,2,6), b = c(3,7,8,8,3), c = c(2,2,4,3,2))

> dt1
    id   a b   c
1:   1   2 5 -99
2: -99   1 3 -99
3:   2 -99 3 -99
4:   2 -99 2   2
5: -99   3 5   5

> dt2
   id a b c
1:  2 6 3 2
2:  3 4 7 2
3:  1 3 8 4
4:  4 2 8 3
5:  3 6 3 2

Как можно заменить -99 dt1 на значения dt2?

Требуемые результаты должны быть dt3:

> dt3
   id a b c
1:  1 2 5 2
2:  3 1 3 2
3:  2 3 3 4
4:  2 2 2 2
5:  3 3 5 5

Ответы [ 5 ]

0 голосов
/ 07 мая 2018

Простой способ - использовать функцию setDF для преобразования в data.frame и использовать методы поднабора фрейма данных. Восстановите до data.table в конце.

#Change to data.frmae
setDF(dt1)
setDF(dt2)

# Perform assignment 
dt1[dt1==-99] = dt2[dt1==-99]

# Restore back to data.table    
setDT(dt1)
setDT(dt2)

dt1
#   id a b c
# 1  1 2 5 2
# 2  3 1 3 2
# 3  2 3 3 4
# 4  2 2 2 2
# 5  3 3 5 5
0 голосов
/ 07 мая 2018

Этот простой трюк будет работать эффективно.

dt1<-as.matrix(dt1)
dt2<-as.matrix(dt2)

index.replace = dt1==-99
dt1[index.replace] = dt2[index.replace]

as.data.table(dt1)
as.data.table(dt2)
0 голосов
/ 07 мая 2018

Вы можете сделать следующее:

dt3 <- as.data.frame(dt1)
dt2 <- as.data.frame(dt2)
dt3[dt3 == -99] <- dt2[dt3 == -99]
dt3

#   id a b c
# 1  1 2 5 2
# 2  3 1 3 2
# 3  2 3 3 4
# 4  2 2 2 2
# 5  3 3 5 5
0 голосов
/ 07 мая 2018

Если ваши данные одного типа (как в вашем примере), то преобразование их в matrix намного быстрее и прозрачнее:

dt1a <- as.matrix(dt1)  ## convert to matrix
dt2a <- as.matrix(dt2)

# make a matrix of the same shape to access the right entries
missing_idx <- dt1a == -99  
dt1a[missing_idx] <- dt2a[missing_idx]  ## replace by reference

Это векторизованная операция, поэтому она должна быть быстрой.

Примечание: Если вы сделаете это, убедитесь, что два источника данных точно совпадают по форме и порядку строк / столбцов. Если это не так, вам нужно присоединиться с помощью соответствующих ключей и выбрать правильные столбцы.

РЕДАКТИРОВАТЬ: Преобразование в матрицу может быть ненужным. Смотрите ответ Ката для более краткого решения.

0 голосов
/ 07 мая 2018

Это должно работать, простой подход:

  for (i in 1:nrow(dt1)){
    for (j in 1:ncol(dt1)){
    if (dt1[i,j] == -99) dt1[i,j] = dt2[i,j]
    }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...