如何从r中的矩阵中删除列的部分



假设我有一个矩阵

[,1] [,2] [,3] [,4]
[1,]  10   11   12   13
[2,]  9    10   15    4
[3,]  5     7    4   10
[4,]  1     2    6    2

我想删除列中值为<=5的部分。即使列的下一行有更高的值(即。[2,4]后面的[3,4]是<5),它们将变成0,所以应该剩下:

[,1] [,2] [,3] [,4]
[1,]  10   11   12   13
[2,]  9    10   15   NA
[3,]  NA    7   NA   NA
[4,]  NA   NA   NA   NA

矩阵是通过使用for循环来迭代人口100次来创建的,所以我的矩阵是100x100。我试图在for循环中使用if函数来删除列的部分内容,但它只是删除了第一个列之后的所有列。

if(matrix[,col]<=5) break

下面是用NA替换矩阵中所需值的方法:

# Create a random matrix with 20 rows and 20 columns
m <- matrix(floor(runif(400, min = 0, max = 101)), nrow = 20)
# Function that iterates through a vector and replaces values <= 5
# and the following values with NA
f <- function(x) {
fillNA <- FALSE
for (i in 1:length(x)) {
if (fillNA || x[i] <= 5) {
x[i] <- NA
fillNA <- TRUE
}
}
x
}
# Apply the function column-wise
apply(m, 2, f)

我们可以用r为底,假设你的矩阵叫做m。下面的函数执行以下操作:

  1. 检查每个元素是否为<=5,产生TRUE/FALSE值
  2. 累计和TRUE/FALSE值。
  3. 将所有非零累积值替换为NA。
  4. 使用apply对矩阵的每列执行此操作

可以放在一行中:

m2 <- apply(m, 2, (x) ifelse(cumsum(x <= 5), NA, x))
[,1] [,2] [,3] [,4]
[1,]   10   11   12   13
[2,]    9   10   15   NA
[3,]   NA    7   NA   NA
[4,]   NA   NA   NA   NA
# Load the necessary packages
library(dplyr)
# Set the seed for reproducibility
set.seed(123)
# Create a random matrix with 100 rows and 100 columns
matrix <- matrix(runif(10000), nrow = 100)
# Replace values in each row of the matrix that are <= 5 with NA
matrix[apply(matrix, 1, function(x) any(x <= 5)), ] <- NA
# View the modified matrix
matrix

此代码首先加载dplyr包,该包对于此任务不是必需的,但在这里用于创建一个随机矩阵。然后,它为再现性设置种子,以便每次运行代码时都生成相同的随机矩阵。接下来,它使用runif函数创建一个包含100行和100列的随机矩阵,该函数生成0到1之间的随机均匀数。最后,它使用apply函数将逻辑应用于矩阵的每一行,并用NA替换为<= 5的任何值。

相关内容

  • 没有找到相关文章

最新更新