gpt4 book ai didi

r - 将频率矩阵转换为 R 中的有序对列表

转载 作者:行者123 更新时间:2023-12-02 08:33:40 24 4
gpt4 key购买 nike

假设我有一个 3x3 的频率值矩阵。此矩阵中的每个单元格代表在特定位置检测到的实体数量(关于这些位置的细节对我们的目的无关紧要)。例如,第 1 行第 1 列中检测到 0 个实体;在第 2 行第 3 列中检测到 3 个实体;等

     [,1] [,2] [,3]
[1,] 0 1 0
[2,] 1 2 3
[3,] 0 1 1

我想将此矩阵转换为 nx2 数据框,其中 n 是在所有位置检测到的实体总数。在这种情况下,应该有 9 行,因为总共检测到 9 个实体。在我们创建的数据框中,第 1 列应包含实体的行索引,第 2 列应包含实体的列索引。

我们可以使用下面的代码来实现这一点,但这种方法对于较大的矩阵来说非常慢。

mat <- matrix(c(0,1,0,1,2,3,0,1,1), nrow = 3, byrow = TRUE)
x <- rep(NA, 9)
y <- rep(NA, 9)
count <- 0
for(i in 1:3){
for(j in 1:3){
while(mat[i,j] > 0){
count <- count + 1
x[count] <- i
y[count] <- j
mat[i,j] <- mat[i,j] - 1
}
}
}
df <- data.frame(x, y)

此代码为我们提供了以下 9x2 数据框:

x  y
1 2
2 1
2 2
2 2
2 3
2 3
2 3
3 2
3 3

我们解释这个数据框的方式是说在位置 (1,2) 检测到一个实体,在位置 (2,1) 检测到一个实体,在位置 (2,2) 检测到两个实体,等等在。此输出是正确的,但我更愿意使用更快的方法来获取它。

有更好的方法吗?

最佳答案

arr.ind 参数提供起点,即具有非零条目的索引,然后您可以rep()-通过条目值吃掉它们:

idxs <- which(dat > 0, arr.ind=TRUE)
idxs[ rep(1:nrow(idxs), dat[dat>0]), ]
row col
[1,] 2 1
[2,] 1 2
[3,] 2 2
[4,] 2 2
[5,] 3 2
[6,] 2 3
[7,] 2 3
[8,] 2 3
[9,] 3 3

关于r - 将频率矩阵转换为 R 中的有序对列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24005830/

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