Выбор столбцов, в которых верен только один элемент - PullRequest
1 голос
/ 05 мая 2020

Я использую следующий код, чтобы определить, имеет ли какой-либо из столбцов в моей таблице данных 1065. Если какой-либо из столбцов имеет 1065, я получаю «ИСТИНА», что отлично работает. Теперь я хочу вывести только true, если любой из столбцов notcancer0: notcancer33 содержит 1065, а все остальные - NA. Другие столбцы могут содержать другие значения, например 1064, 1066, и т.д. c. Но я хочу вывести «ИСТИНА» для строк, где есть только 1065, а все остальные столбцы содержат NA для этой строки. Как лучше всего это сделать?

biobank_nsaid[, ischemia1 := Reduce(`|`, lapply(.SD, `==`, "1065")), .SDcols=notcancer0:notcancer33]

Пример данных:

biobank_nsaid = structure(list(aspirin = structure(c(2L, 1L, 1L, 1L), .Label =
 c("FALSE", "TRUE"), class = "factor"), aspirinonly = c(TRUE, FALSE, FALSE, 
FALSE), med0 = c(1140922174L, 1140871050L, 1140879616L, 1140909674L ), med1 = 
c(1140868226L, 1140876592L, 1140869180L, NA), med2 = c(1140879464L, NA, 
1140865016L, NA), med3 = c(1140879428L, NA, NA, NA)), row.names = c(NA, -4L), 
class = c("data.table", "data.frame"))

1 Ответ

1 голос
/ 06 мая 2020

Вот 2 варианта:

setDT(biobank_nsaid)[, ischemia1 := 
    rowSums(is.na(.SD))==ncol(.SD)-1L & rowSums(.SD==1140909674, na.rm=TRUE)==1L, 
    .SDcols=med0:med3]

Или после каких-то булевых манипуляций:

biobank_nsaid[, ic2 := 
    !(rowSums(is.na(.SD))!=ncol(.SD)-1L | rowSums(.SD==1140909674, na.rm=TRUE)!=1L), 
    .SDcols=med0:med3]
...