Создание нового столбца на основе нескольких возможных вариантов ячейки в нескольких столбцах - PullRequest
1 голос
/ 05 апреля 2020

data[, allkneePR := Reduce(`|`, lapply(.SD, `==`, "0082")), .SDcols=PR1:PR3]

Эй, я пытаюсь найти разные диагнозы c ("0082", "0083", "0084") в диапазоне строк и столбцов в data.table (набор данных огромен). Если одно из значений равно «0082», «0083» или «0084» в любом из столбцов PR1: PR3, я хочу другой столбец, который указывает на «истину». Сейчас это работает с приведенным выше кодом, но я пытаюсь добавить несколько диагнозов, а не просто «0082». Я попробовал функцию any (), которая не работает, и просто использование вектора c ("0082", "0083", "0084") не работает.

Мысли? Спасибо!

Забавный набор данных по практике здесь:

data <- as.data.table(data.frame(PR1 = c("0081", "0082", "0083", "0084", "8154"), PR2 = c("12","0084", "1","3", "9"), PR3 = c("9", "12", "25", "0083", "8154")))

data[, allkneePR := Reduce(`|`, lapply(.SD, `==`, "0082")), .SDcols=PR1:PR3]
data

1 Ответ

1 голос
/ 05 апреля 2020

Мы можем использовать %in% вместо == для сравнения вектора длиной более 1

library(data.table)
data[, allkneePR := Reduce(`|`, lapply(.SD, `%in%`, 
               c("0082", "0083", "0084"))), .SDcols=PR1:PR3]

data
#    PR1  PR2  PR3 allkneePR
#1: 0081   12    9     FALSE
#2: 0082 0084   12      TRUE
#3: 0083    1   25      TRUE
#4: 0084    3 0083      TRUE
#5: 8154    9 8154     FALSE

Если столбцы являются символьными, можно изменить %in% на %chin%

...