我有一组对象,假设 ID 为“A”到“J”。我有两个数据框,看起来如下(如您所见,第二个数据框是对称的):
df1 <- data.frame(ID = LETTERS[1:5], Var = c(9,13,15,11,28))
df2 <- as.data.frame(matrix(data = c(NA,42,83,74,84,42,NA,26,69,9,83,26,NA,67,95,74,69,67,NA,6,84,9,95,6,NA), ncol = 5, nrow = 5, dimnames = list(df1$ID, df1$ID)))
例如,以对象“B”和“E”为例。我想知道:13+28(来自df1
)是否小于 9(来自df2
)?我想知道所有成对的对象。输出应该是
(a) 一个逻辑数据帧,其结构类似于df2
和
(b) “真”值的数量。
大多数时候我只需要结果(b),但有时我也需要(a)。因此,如果可以在没有 (a) 的情况下计算 (b) 并且这会明显更快,那么我希望同时拥有这两种算法,以便根据我需要回答特定问题的输出来选择合适的算法。
我正在比较大约 2000 个对象,所以算法应该相当快。到目前为止,我只能用两个for
非常慢的嵌套循环来实现这一点。我敢打赌,有更好的方法可以做到这一点,也许是利用矢量化。
这是它目前的样子:
df3 <- as.data.frame(matrix(data = NA, ncol = nrow(df1), nrow = nrow(df1),
dimnames = list(df1$ID, df1$ID)))
for (i in 2:nrow(df3)){
for (j in 1:(i-1)){
sum.val <- df1[df1$ID == rownames(df3)[i], "Var"] + df1[df1$ID == names(df3)[j], "Var"]
df3[i,j] <- sum.val <= df2[i,j]
}
}
#