gpt4 book ai didi

r - 用 R data.table 行的排列填充 "count matrix"

转载 作者:行者123 更新时间:2023-12-04 17:43:16 25 4
gpt4 key购买 nike

(对于以下内容,我可以使用 R data.frame 或 R data.table。两者都可以。)

我有以下数据表:

library(data.table)

dt = data.table(V1=c("dog", "dog", "cat", "cat", "cat", "bird","bird","bird","bird"),
V2=rep(42, 9), V3=c(1, 2, 4, 5, 7, 1, 2, 5, 8))

> print(dt)
V1 V2 V3
1: dog 42 1
2: dog 42 2
3: cat 42 4
4: cat 42 5
5: cat 42 7
6: bird 42 1
7: bird 42 2
8: bird 42 5
9: bird 42 8

栏目 V3包含从 1 到 8 的整数。我的目标是使用列 V1 中给定唯一类别的每个组合“对”的计数填充 8 x 8 零矩阵。

因此, dog 的组合对, cat , 和 bird是:
dog: (1, 2)
cat: (4, 5), (4, 7), (5, 7)
bird: (1, 2), (1, 5), (1, 8), (2, 5), (2, 8), (5, 8)

对于每一对,我添加 +1到零矩阵中的相应条目。对于这个矩阵, (n, m) = (m, n) .给出的矩阵 dt将是:
   1 2 3 4 5 6 7 8
1: 0 2 0 0 1 0 0 1
2: 2 0 0 0 1 0 0 1
3: 0 0 0 0 0 0 0 0
4: 0 0 0 0 1 0 1 0
5: 1 1 0 1 0 0 1 1
6: 0 0 0 0 0 0 0 0
7: 0 0 0 1 1 0 0 0
8: 1 1 0 0 1 0 0 0

请注意 (1,2)=(2,1)计数为 2,来自 dog组合和 bird组合。

(1) 给定另一列中的唯一值,是否有一种方法可以计算 R data.table/data.frame 列中的值组合?

也许输出一个带有向量“对”的 R 列表是有意义的,例如
list(c(1, 2), c(2, 1), c(4, 5), c(4, 7), c(5, 7), c(5, 4), c(7, 4), c(7, 5),
c(1, 2), c(1, 5), c(1, 8), c(2, 5), c(2, 8), c(5, 8), c(2, 1), c(5, 1),
c(8, 1), c(5, 2), c(8, 2), c(8, 5))

但是,我不确定如何使用它来填充矩阵...

(2) 给定输入 data.table/data.frame,用于写出矩阵的最有效数据结构是什么,如上所述?

最佳答案

这是一个似乎有效的 data.table 解决方案。我们基本上做一个自连接以创建组合然后计数。然后,类似于@coldspeed 对 Numpy 所做的,我们将仅通过带有计数的位置更新零矩阵。

# a self join
tmp <- dt[dt,
.(V1, id = x.V3, id2 = V3),
on = .(V1, V3 < V3),
nomatch = 0L,
allow.cartesian = TRUE
][, .N, by = .(id, id2)]

## Create a zero matrix and update by locations
m <- array(0L, rep(max(dt$V3), 2L))
m[cbind(tmp$id, tmp$id2)] <- tmp$N
m + t(m)

# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 0 2 0 0 1 0 0 1
# [2,] 2 0 0 0 1 0 0 1
# [3,] 0 0 0 0 0 0 0 0
# [4,] 0 0 0 0 1 0 1 0
# [5,] 1 1 0 1 0 0 1 1
# [6,] 0 0 0 0 0 0 0 0
# [7,] 0 0 0 1 1 0 0 0
# [8,] 1 1 0 0 1 0 0 0

或者,我们可以创建 tmp使用 data.table::CJ但这可能(可能 - 感谢@Frank 的提示)内存效率较低,因为它会首先创建所有可能的组合,例如
tmp <- dt[, CJ(V3, V3)[V1 < V2], by = .(g = V1)][, .N, by = .(V1, V2)]

## Then, as previously
m <- array(0L, rep(max(dt$V3), 2L))
m[cbind(tmp$V1, tmp$V2)] <- tmp$N
m + t(m)

# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 0 2 0 0 1 0 0 1
# [2,] 2 0 0 0 1 0 0 1
# [3,] 0 0 0 0 0 0 0 0
# [4,] 0 0 0 0 1 0 1 0
# [5,] 1 1 0 1 0 0 1 1
# [6,] 0 0 0 0 0 0 0 0
# [7,] 0 0 0 1 1 0 0 0
# [8,] 1 1 0 0 1 0 0 0

关于r - 用 R data.table 行的排列填充 "count matrix",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51811519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com