Скажем, у меня есть data.table такие, как: (или с цифрами и НСБУ)R data.table применить функцию для всех пар столбцов
temp <- data.table(M=c(NA,T,T,F,F,F,NA,NA,F),
P=c(T,T,T,F,F,F,NA,NA,NA), S=c(T,F,NA,T,F,NA,NA,NA,NA))
M P S
NA TRUE TRUE
TRUE TRUE FALSE
TRUE TRUE NA
FALSE FALSE TRUE
FALSE FALSE FALSE
FALSE FALSE NA
NA NA NA
NA NA NA
FALSE NA NA
И я хочу, чтобы проверить, когда переменная NA означает что значения второй переменной - все NA. Проверить, связаны ли некоторые переменные с другими.
Например, когда P = NA, мы также имеем S = NA.
Этот код работает правильно для двух отдельных колонок:
temp[is.na(P),all(is.na(S))]
дает TRUE,
и
temp[is.na(S),all(is.na(P))]
дает FALSE, потому что шестой строка S = NA, но P = NA!.
Теперь мой вопрос. Я хотел бы обобщить его, проверив все пары в моей таблице data.table и напечатаю, какие пары «связаны».
Я бы предпочел напечатать только те результаты, которые являются ИСТИНАМИ, игнорируя FALSE, потому что большинство пар в моей реальной таблице данных не будут связаны, и у меня есть 550 переменных.
Я попробовал этот код:
temp[, lapply(.SD, function(x) temp[is.na(x),
lapply(.SD, function(y) all(is.na(y)))]]
Я получаю эту ошибку
Error: unexpected ']' in: "temp[, lapply(.SD, function(x) temp[is.na(x), lapply(.SD, function(y) all(is.na(y)))]]"
Я мог бы попробовать с цикл, но я бы предпочел типичный data.table синтаксис. Любые предложения приветствуются.
Я также хотел бы знать, как обращаться к двум различным .SD, когда вы вставляете вызовы data.table.
Невозможно ли это сделать с помощью data.table? (по причинам скорости) – skan
@skan: Я считаю, что единственная вещь, которую можно использовать (относительно эффективности) - последняя строка - например, что-то вроде 'ij = which (col (ans)! = row (ans), TRUE); data.frame (v1 = rownames (ans) [ij [, "row"]], v2 = colnames (ans) [ij [, "col"]], val = ans [ij]) 'может избежать некоторых накладных расходов. «crossprod» предлагает очень удобный алгоритм для эффективного вычисления всех парных комбинаций на матрицах, а также итоговая матрица 550 * 550 не вызывает проблем с памятью. Вы нашли какое-то узкое место на бенчмарке? –
ОК, завтра я применим ваш ответ и akrun один к моему большому набору данных и сделаю тест и определю, кто победитель. – skan