R data.table将函数应用于所有列对

ska*_*kan 3 r data.table

假设我有一个data.table,例如:(或带数字和NA)

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
Run Code Online (Sandbox Code Playgroud)

我想检查变量是否为NA意味着第二个变量的值都是NA.检查某些变量是否与其他变量相关联.

例如,每当P = NA时,我们也有S = NA.

此代码适用于两个单独的列:

temp[is.na(P),all(is.na(S))]
Run Code Online (Sandbox Code Playgroud)

给予TRUE

temp[is.na(S),all(is.na(P))]
Run Code Online (Sandbox Code Playgroud)

假设为FALSE,因为第六行是S = NA但是P!= NA.

现在我的问题.我想概括一下,检查我的data.table中的所有对,并打印哪些对是"链接"的.
我更喜欢只打印TRUE的结果,忽略FALSE,因为我的真实data.table中的大多数对都不会被链接,而且我有550个变量.

我试过这段代码:

temp[, lapply(.SD, function(x) temp[is.na(x), 
                 lapply(.SD, function(y)  all(is.na(y)) )]]
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

错误:意外']':"temp [,lapply(.SD,function(x)temp [is.na(x),lapply(.SD,function(y)all(is.na(y))]] ]"

我可以尝试使用for循环,但我更喜欢典型的data.table语法.任何建议都是受欢迎的.

我还想知道在嵌套data.table调用时如何引用两个不同的.SD.

ale*_*laz 5

对于成对组合,crossprod似乎还有用.

我们只关心价值是否NA:

NAtemp = is.na(temp)
Run Code Online (Sandbox Code Playgroud)

比较NAs 的共存:

crossprod(NAtemp)
#  M P S
#M 3 2 2
#P 2 3 3
#S 2 3 5
Run Code Online (Sandbox Code Playgroud)

NA每列的数量:

colSums(NAtemp)
#M P S 
#3 3 5
Run Code Online (Sandbox Code Playgroud)

喜欢:

ans = crossprod(NAtemp) == colSums(NAtemp)
ans
#      M     P     S
#M  TRUE FALSE FALSE
#P FALSE  TRUE  TRUE
#S FALSE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

并使用方便的as.data.frame.table格式:

subset(as.data.frame(as.table(ans)), Var1 != Var2)
#  Var1 Var2  Freq
#2    P    M FALSE
#3    S    M FALSE
#4    M    P FALSE
#6    S    P FALSE
#7    M    S FALSE
#8    P    S  TRUE
Run Code Online (Sandbox Code Playgroud)