gpt4 book ai didi

R:将数据框的元素与邻居相乘

转载 作者:行者123 更新时间:2023-12-04 10:41:05 28 4
gpt4 key购买 nike

我有一个 300x300 元素的数据框。它们每个都是 -1 或 +1:

     [,1]   [,2]   [,3]  
[1,] 1 -1 -1
[2,] 1 1 1
[3,] -1 -1 1
[4,] 1 1 -1

我想要的是遍历我的数据框,并将每个值与每个相邻值相乘。
即:
对于原始数据框中的元素 [1,1],我需要 [1,1]、[1,2] 和 [2,1] 的乘积
对于原始数据框中的元素 [2,2],我需要 [2,2]、[1,2]、[2,1]、[2,3] 和 [3,2] 的乘积。

我尝试创建 4 个新数据框,每个数据框分别向右、左、上和下移动 1 个元素:

x_up <- shift(x, 1, dir='up')
x_up <- as.array(x_up)
dim(x_up) <- dims
x_down <- shift(x, 1, dir='down')
x_down <- as.array(x_down)
dim(x_down) <- dims
x_left <- shift(x, 1, dir='left')
x_left <- as.array(x_left)
dim(x_left) <- dims
x_right <- shift(x, 1, dir='right')
x_right <- as.array(x_right)
dim(x_right) <- dims

其中 x 是我的原始数据框。
我可以看到当我使用这种方法时,新的数据帧没有正确地移位;他们中的更多人是相同的。我用 identical() 检查了这一点。

是否有其他方法可以解决我的问题?

编辑:
shift() 属于 'binhf' 库

最佳答案

我认为可能有更聪明的方法来做到这一点,但标准方法是迭代每个元素并乘以其周围环境。

开始于:

mat <- matrix(c(1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1), ncol=3)

为了避免正边距出现问题,您必须添加一列和一行 1 作为边距(正 1 在乘法时不会有问题,如果您正在对它求和例如,必须是 0

mat2 <- addmargins(mat, FUN=function(x) 1)

现在您创建一个空矩阵来保存输出,然后遍历元素并乘以相邻元素。

out <- matrix(nrow=nrow(mat), ncol=ncol(mat))
for (i in 1:nrow(mat)) {
for (j in 1:ncol(mat)) {
out[i,j] <- prod(mat[i,j], mat2[i-1, j], mat2[i, j-1], mat2[i+1, j], mat2[i, j+1])
}
}

导致:

> out
[,1] [,2] [,3]
[1,] -1 1 1
[2,] -1 1 -1
[3,] 1 1 1
[4,] -1 1 -1

对于 300x300 的矩阵,这花费了不到一秒钟的时间,所以这对您来说可能已经足够了。

关于R:将数据框的元素与邻居相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30288556/

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