繁体   English   中英

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

[英]R data.table apply function to all pair of columns

假设我有一个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

我想检查变量是否为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中的所有对,并打印哪些对是“链接”的。
我更喜欢只打印TRUE的结果,忽略FALSE,因为我的真实data.table中的大多数对都不会被链接,而且我有550个变量。

我试过这段代码:

temp[, lapply(.SD, function(x) temp[is.na(x), 
                 lapply(.SD, function(y)  all(is.na(y)) )]]

我收到这个错误

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

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

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

对于成对组合, crossprod似乎仍然有用。

我们只关心值是否为NA

NAtemp = is.na(temp)

比较NA的共存:

crossprod(NAtemp)
#  M P S
#M 3 2 2
#P 2 3 3
#S 2 3 5

每列NA的数量:

colSums(NAtemp)
#M P S 
#3 3 5

喜欢:

ans = crossprod(NAtemp) == colSums(NAtemp)
ans
#      M     P     S
#M  TRUE FALSE FALSE
#P FALSE  TRUE  TRUE
#S FALSE FALSE  TRUE

并使用方便的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

我们可以尝试使用combn

unlist(combn(names(temp), 2, FUN = function(nm)
  list(setNames(temp[is.na(get(nm[1])), all(is.na(get(nm[2])))], paste(nm, collapse="-"))))) 
#   M-P   M-S   P-S 
# FALSE FALSE  TRUE 

或者如果我们还需要所有组合

d1 <- CJ(names(temp), names(temp))[V1!=V2]
d1[,  .(index=temp[is.na(get(V1)), all(is.na(get(V2)))]) , .(V1, V2)]
#    V1 V2 index
#1:  M  P FALSE
#2:  M  S FALSE
#3:  P  M FALSE
#4:  P  S  TRUE
#5:  S  M FALSE
#6:  S  P FALSE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM