Как проверить, находится ли значение столбца в диапазоне еще двух для каждой строки в таблице данных - PullRequest
3 голосов
/ 29 марта 2019

Сейчас я работаю над проблемой R и на своем последнем шаге я хотел бы проверить, содержат ли мои 95% доверительные интервалы истинные значения параметров. У меня есть вопрос на этом этапе.

dat <- data.table(low = c(0.9, 1.1, 1, 0.95),
                  up = c(0.99, 1.2, 1.3, 1.4),
                  true = c(1, 1.15, 1.2, 1.5))

Например, в первой строке я хотел бы проверить, соответствует ли истинное значение 1 доверительному интервалу от 0,9 до 0,99. Очевидно, не так вернуть 0. После изучения по строке. Желаемые результаты будут:

result <- data.table(low = c(0.9, 1.1, 1, 0.95),
                     up = c(0.99, 1.2, 1.3, 1.4),
                     true = c(1, 1.15, 1.2, 1.5), 
                     conv = c(0, 1, 1, 0))
print(result)

Есть ли какой-нибудь эффективный способ решить эту проблему? Большое спасибо за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 29 марта 2019

Наиболее эффективным способом, вероятно, является оператор between:

> result[, conv2 := as.integer(true %between% .(low, up))]
> result
    low   up true conv conv2
1: 0.90 0.99 1.00    0     0
2: 1.10 1.20 1.15    1     1
3: 1.00 1.30 1.20    1     1
4: 0.95 1.40 1.50    0     0

. Вы можете пропустить as.integer, чтобы получить логический столбец, который является более стандартным при кодировании таких данных в R.

Используемая здесь функция between взята из data.table и имеет два синтаксиса:

x %between% list(dn, up)
between(x, dn, up)

Внутри DT[...] вы можете сократить list() до .().

0 голосов
/ 29 марта 2019

Это работает идиоматически в data.table

dat[, inConf := ifelse(true >= low & true <= up,T,F)]

###alternatively with 0,1
dat[, inConf := ifelse(true >= low & true <= up,1,0)]
...