Замените значения в нескольких столбцах data.table, которые удовлетворяют условию - PullRequest
0 голосов
/ 25 апреля 2020
library(data.table)
data = data.table("cat" = c(0,5,NA,0,0,0),
                  "horse" = c(0,4,2,1,1,3),
                  "fox" = c(2,2,NA,NA,7,0))

I wi sh для замены значений 'cat' и 'fox', которые равны '0' или '2', на '-99'

Я могу сделать это по одному время, но как сделать их обоих?

dat[fox == 0 | fox == 2, fox := -99]

Ответы [ 3 ]

3 голосов
/ 25 апреля 2020

Другой подход с использует for(...) set(...) -подход, который в этом случае является быстрым и эффективным с точки зрения памяти:

cols <- c('fox', 'cat')

# option 1
for (j in cols) d[get(j) %in% c(0, 2), (j) := -99]

# option 2 (thx to @Cole for highlighting)
for (j in cols) set(d, which(d[[j]] %in% c(0, 2)), j, value = -99)

# option 3 (thx to @Frank for highlighting)
for (j in cols) d[.(c(0,2)), on = j, (j) := -99]

, что дает:

> d
   cat horse fox
1: -99     0 -99
2:   5     4 -99
3:  NA     2  NA
4: -99     1  NA
5: -99     1   7
6: -99     3 -99

d  <- data.table("cat"   = c(0,5,NA,0,0,0),
                 "horse" = c(0,4,2,1,1,3),
                 "fox"   = c(2,2,NA,NA,7,0))
1 голос
/ 25 апреля 2020

Если я понимаю, это также будет работать:

cols = c("cat", "fox")
data[, (cols) := lapply(.SD, function (x) fifelse(x %in% c(0, 2), -99, x)), .SDcols = cols]
1 голос
/ 25 апреля 2020

Вот не очень элегантный способ сделать это:

> data
   cat horse fox
1:   0     0   2
2:   5     4   2
3:  NA     2  NA
4:   0     1  NA
5:   0     1   7
6:   0     3   0

> data[, c('fox', 'cat') := list(ifelse(cat %in% c(0,2) | fox %in% c(0,2), 99, cat ), ifelse(cat %in% c(0,2) | fox %in% c(0,2), 99, cat ))]
> data
   cat horse fox
1:  99     0  99
2:  99     4  99
3:  NA     2  NA
4:  99     1  99
5:  99     1  99
6:  99     3  99

Я звоню (c('cat', 'fox')) явно, но вы можете сохранить их как mycols и назначить, используя оператор :=: data[, mycols := ...]

Точно так же я передаю список явно в зависимости от условий - это можно сделать лучше, используя вместо этого функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...