gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:17:07 24 4
gpt4 key购买 nike

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

给出正确的

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)) )]]

我收到此错误

Error: unexpected ']' in: "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)

比较NAs的共存情况:

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

关于R data.table 将函数应用于所有列对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41351186/

24 4 0